需求
需要服务器运行的程序在被意外杀死时,能自动重启,同时提醒我程序发生过重启。在服务器硬盘使用量达到一定比例的时候,提醒迁移数据或者清理无用的日志文件,所以需要一个服务器的守护程序(能在centos上运行),要求轻量简单占用少,根据上面的需求,找到了supervisor和monit2款软件
supervisor 和 monit的对比
因为主要是要满足以上我们的需求,所以我们根据实际需求来对比,而不是完全对比软件本身
进程守护
supervisor:
优点:采用托管的方式守护,一旦进程异常能马上检查出来,可以指定目录,对启动命令本身修改不大
缺点:只能启动前台进程,一旦supervisor发生重启会再次启动进程,导致进程再次被启动(不知道有没有办法避免,)
monit:
优点:有基于pid文件和正则匹配的检查进程,不会导致进程重复启动
缺点:通过定时检查的方式检查进程,存在一定延时,另外启动命令必须要包含完整的路径
提醒
supervisor:需要使用第三方插件才能实现邮件提醒功能,本身并不支持邮件提醒
monit:原生支持邮件提醒功能
磁盘监控
supervisor:本身只是为了守护进程,所以需要第三方扩展才可以监控磁盘
monit:原生支持磁盘监控
轻量级占用少
supervisor:基于Python开发,轻量级
monit:轻量级
其他
2款软件都提供了网页管理的功能,monit能在页面中直接对进程进行重启,停止和启动操作,supervisor能直接在页面中查看软件输出的日志
综合以上的对比,最后觉得还是monit适合我们,所以我们选择了monit
安装和配置monit
在centos中,可以直接通过yum命令安装
1 | sudo yum install -y monit |
安装完成后执行命令
1 | sudo vi /etc/monitrc |
编辑配置文件
1 | set daemon 30 # 每隔30秒检测一次 |
服务类型
首先需要理解在monit里什么是服务(service)。看监控语法:
1 | check <类型> <服务名> [PATH <path>] [ADDRESS <host address>] |
其中类型是monit支持的监控类型,一共有:system、file、process、fifo、filesystem、directory、host、network、program。
服务名必需是英文且唯一,不可以出现重复!
后面的带[]是根据类型需要添加的。
进程
1 | 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文件,文件内容如下:
1 | #tomcat |
第一行代码是注释,第二行代码是判断进程tomcat是否在运行,是通过名称匹配的,第三行是配置的启动脚本路径,第四行是配置的停止脚本路径
另外需要注意的是,如果在启动或者停止脚本的时候需要用到其他软件或者包含路径的时候,比如nohup等,一定要使用绝对路径,否则可能会出错导致无法启动
磁盘
1 | CHECK DEVICE <unique name> PATH <path> |
在服务器中,很多时候日志文件除了会写入数据库、搜索引擎外,Tomcat的日志本身也会保留,所以也需要注意服务器的磁盘剩余空间占用
1 | #vda1 |
这里是判断如果vda1这个磁盘使用空间大于80%就发邮件提醒
其他监控
文件
1 | CHECK FILE <unique name> PATH <path> |
是文件的绝对路径。如果文件不存在,Monit将调用该条目的start方法(如果已定义),如果不指向常规文件类型(例如目录),Monit将禁用此条目的监视。如果Monit在被动模式下运行或者没有定义start方法,Monit只会在错误时发送警报。
Fifo
1 | CHECK FIFO <unique name> PATH <path> |
是fifo的绝对路径。如果fifo不存在,Monit将定义调用该条目的start方法,如果没有指向fifo类型(例如目录),Monit将禁用对该条目的监视。如果Monit在被动模式下运行或者没有定义start方法,Monit只会在错误时发送警报。
文件系统
1 | CHECK FILESYSTEM <unique name> PATH <path> |
是设备/磁盘,安装点,文件或作为文件系统一部分的目录的路径。建议直接使用块特殊文件(例如Linux上的/dev/vda1或Solaris上的/dev/dsk/c0t0d0s1等)如果使用挂载点(例如/data),请注意文件系统是卸载的测试仍然是真的,因为挂载点存在。
如果文件系统不可用,Monit将调用该条目的start方法(如果已定义)。如果不指向文件系统,Monit将禁用对此条目的监视。如果Monit在被动模式下运行或者没有定义start方法,Monit只会在错误时发送警报。
目录
1 | CHECK DIRECTORY <unique name> PATH <path> |
是目录的绝对路径。如果目录不存在,Monit将调用该条目的start方法(如果已定义)。如果不指向目录,monit将禁用对此条目的监视。如果Monit在被动模式下运行或者没有定义启动方法,Monit只会在错误时发送警报。
monit常用命令
1 | monit -t # 配置文件检测 |
其他
当然monit远不止上面介绍的功能,比如还有远程主机、系统、网络以及自定义一些监控,另外monit还支持检查时间和提醒的相关自定义定制,因为本文主要是介绍使用monit监控服务进程和硬盘以及自动重启进程,所以没有详细介绍其他用法,有兴趣的可以自行了解