需求
需要服务器运行的程序在被意外杀死时, 能自动重启, 同时提醒我程序发生过重启. 在服务器硬盘使用量达到一定比例的时候, 提醒迁移数据或者清理无用的日志文件, 所以需要一个服务器的守护程序(能在 centos 上运行), 要求轻量简单占用少, 根据上面的需求, 找到了 supervisor 和 monit2 款软件
supervisor 和 monit 的对比
因为主要是要满足以上我们的需求, 所以我们根据实际需求来对比, 而不是完全对比软件本身
进程守护
supervisor:
优点: 采用托管的方式守护, 一旦进程异常能马上检查出来, 可以指定目录, 对启动命令本身修改不大
缺点: 只能启动前台进程, 一旦 supervisor 发生重启会再次启动进程, 导致进程再次被启动(不知道有没有办法避免,)
monit:
优点: 有基于 pid 文件和正则匹配的检查进程, 不会导致进程重复启动
缺点: 通过定时检查的方式检查进程, 存在一定延时, 另外启动命令必须要包含完整的路径
提醒
supervisor: 需要使用第三方插件才能实现邮件提醒功能, 本身并不支持邮件提醒
monit: 原生支持邮件提醒功能
磁盘监控
supervisor: 本身只是为了守护进程, 所以需要第三方扩展才可以监控磁盘
monit: 原生支持磁盘监控
轻量级占用少
supervisor: 基于 Python 开发, 轻量级
monit: 轻量级
其他
2 款软件都提供了网页管理的功能, monit 能在页面中直接对进程进行重启, 停止和启动操作, supervisor 能直接在页面中查看软件输出的日志
综合以上的对比, 最后觉得还是 monit 适合我们, 所以我们选择了 monit
安装和配置 monit
在 centos 中, 可以直接通过 yum 命令安装
sudo yum install -y monit
安装完成后执行命令
sudo vi /etc/monitrc
编辑配置文件
- set daemon 30 # 每隔 30 秒检测一次
- set log syslog # 日志配置
- set mailserver smtp.office365.com port 587 # 邮箱的 smtp 服务器和端口
- username "xxxxxx@outlook.com" password "xxxxx" # 邮箱的账号和密码
- using tlsv1, STARTTLS # 是否使用 ssl 和加密串
- set alert xxxxxx@qq.com # 接受提醒的邮箱, 可以配置多条
- # 邮箱的模板配置
- set mail-format {
- from: xxxxxx@outlook.com # 同上面的发件邮箱账号相同即可
- subject: monit alert -- $EVENT $SERVICE
- message: $EVENT Service $SERVICE
- Date: $DATE
- Action: $ACTION
- Host: $HOST
- Description: $DESCRIPTION
- Your faithful employee,
- Monit
- }
- set httpd port 2812 and # http 服务的端口
- use address localhost # 只能通过 localhost 访问, 这里是指的 URL 只能是 localhost:2812, 如果不用, 去掉或者注释此条
- allow localhost # 只允许本机访问, 如果要其他 IP 能访问, 注释此条
- allow username:password # 访问页面的用户密码
- include /etc/monit.d/* # 导入配置文件, 我们将具体的软件守护和磁盘监控配置到这里的文件夹里面
服务类型
首先需要理解在 monit 里什么是服务(service). 看监控语法:
check <类型> <服务名> [PATH <path>] [ADDRESS <host address>]
其中类型是 monit 支持的监控类型, 一共有: system,file,process,fifo,filesystem,directory,host,network,program. 服务名必需是英文且唯一, 不可以出现重复! 后面的带 [] 是根据类型需要添加的.
进程
CHECK PROCESS <unique name> <PIDFILE <path> | MATCHING <regex>>
进程有 2 种判断模式, 一种是 pid 文件, 一种是名称匹配 pidfile 后面的 是 pid 文件的绝对路径. pid 文件是一个包含进程唯一 ID 的文件. 如果 pid 文件不存在或不包含正在运行的进程的 PID 编号, 则 Monit 将调用该条目的 start 方法(如果已定义)
如果进程本身并不存在 pid 文件, 那么就可以使用名称匹配. 名称匹配会选择具有最长正常运行时间的最顶部匹配的父级, 因此如果进程名称是唯一的, 则此检查形式是最有用的. 应该尽可能使用 Pid 文件, 因为它定义了预期的 PID. 您可以测试一个进程是否匹配来自命令行使用的模式 monit procmatch "regex-pattern". 这将列出匹配的所有进程
监控程序
配置程序监控, 以 Tomcat 为例, 在 / etc/monit.d / 文件夹中创建 tomcat 文件, 文件内容如下:
- #tomcat
- check process tomcat with matching "tomcat"
- start program = "/usr/local/tomcat/bin/startup.sh"
- stop program = "/usr/local/tomcat/bin/shutdown.sh"
第一行代码是注释, 第二行代码是判断进程 tomcat 是否在运行, 是通过名称匹配的, 第三行是配置的启动脚本路径, 第四行是配置的停止脚本路径
另外需要注意的是, 如果在启动或者停止脚本的时候需要用到其他软件或者包含路径的时候, 比如 nohup 等, 一定要使用绝对路径, 否则可能会出错导致无法启动
磁盘
CHECK DEVICE <unique name> PATH <path>
在服务器中, 很多时候日志文件除了会写入数据库, 搜索引擎外, Tomcat 的日志本身也会保留, 所以也需要注意服务器的磁盘剩余空间占用
- #vda1
- check device vda1 with path /dev/vda1
- if space usage> 80% then alert
这里是判断如果 vda1 这个磁盘使用空间大于 80% 就发邮件提醒
其他监控
文件
CHECK FILE <unique name> PATH <path>
是文件的绝对路径. 如果文件不存在, Monit 将调用该条目的 start 方法(如果已定义), 如果 不指向常规文件类型(例如目录),Monit 将禁用此条目的监视. 如果 Monit 在被动模式下运行或者没有定义 start 方法, Monit 只会在错误时发送警报.
- Fifo
- CHECK FIFO <unique name> PATH <path>
是 fifo 的绝对路径. 如果 fifo 不存在, Monit 将定义调用该条目的 start 方法, 如果 没有指向 fifo 类型(例如目录),Monit 将禁用对该条目的监视. 如果 Monit 在被动模式下运行或者没有定义 start 方法, Monit 只会在错误时发送警报.
文件系统
CHECK FILESYSTEM <unique name> PATH <path>
是设备 / 磁盘, 安装点, 文件或作为文件系统一部分的目录的路径. 建议直接使用块特殊文件 (例如 Linux 上的 / dev/vda1 或 Solaris 上的 / dev/dsk/c0t0d0s1 等) 如果使用挂载点(例如 / data), 请注意文件系统是卸载的测试仍然是真的, 因为挂载点存在.
如果文件系统不可用, Monit 将调用该条目的 start 方法(如果已定义). 如果不指向文件系统, Monit 将禁用对此条目的监视. 如果 Monit 在被动模式下运行或者没有定义 start 方法, Monit 只会在错误时发送警报.
目录
CHECK DIRECTORY <unique name> PATH <path>
是目录的绝对路径. 如果目录不存在, Monit 将调用该条目的 start 方法(如果已定义). 如果 不指向目录, monit 将禁用对此条目的监视. 如果 Monit 在被动模式下运行或者没有定义启动方法, Monit 只会在错误时发送警报.
monit 常用命令
- monit -t # 配置文件检测
- monit # 启动 monit daemon
- monit -c /var/monit/monitrc # 启动 monit daemon 时指定配置文件
- monit reload # 当更新了配置文件需要重载
- monit status # 查看所有服务状态
- monit status xxx # 查看 xxx 服务状态 (xxx) 为配置的 < unique name>
- monit stop all # 停止所有服务
- monit stop xxx # 停止 xxx 服务
- monit start all # 启动所有服务
- monit start xxx # 启动 xxx 服务
- monit -V # 查看版本
其他
当然 monit 远不止上面介绍的功能, 比如还有远程主机, 系统, 网络以及自定义一些监控, 另外 monit 还支持检查时间和提醒的相关自定义定制, 因为本文主要是介绍使用 monit 监控服务进程和硬盘以及自动重启进程, 所以没有详细介绍其他用法, 有兴趣的可以自行了解
来源: https://juejin.im/entry/5b57ed306fb9a04fbd1b2cc9