我正在尝试与monit一起观看邮件列表pipe理器sympa。 正在运行的sympa实例由列表pipe理的不同任务(例如,用于归档电子邮件的单独进程)组成的多个进程组成,但是所有进程都使用单个init脚本启动/停止。
最好,monit应该提醒我,如果任何服务失败,然后重新启动sympa,但只能重新启动一次。 第一个解决scheme如下所示:
check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" check process sympa_bounced with pidfile /var/run/sympa/bounced.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" check process sympa_bulk with pidfile /var/run/sympa/bulk.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop"
但是,如果我手动停止sympa,初始化脚本将被多次执行,每次我定义的服务都会执行一次(因为每个服务都失败了)。
我的第二种方法是定义依赖关系,只有在任何子服务失败时才会发出警报:
check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" depends on sympa_bounced, sympa_bulk check process sympa_bounced with pidfile /var/run/sympa/bounced.pid if does not exist then alert check process sympa_bulk with pidfile /var/run/sympa/bulk.pid if does not exist then alert
但是由于子服务没有重启,主服务也不会重启。 所以我想通过设置开始/停止到/bin/true
可以'重启'重启:
check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" depends on sympa_bounced, sympa_bulk check process sympa_bounced with pidfile /var/run/sympa/bounced.pid start program = "/bin/true" stop program = "/bin/true" check process sympa_bulk with pidfile /var/run/sympa/bulk.pid start program = "/bin/true" stop program = "/bin/true"
这也不起作用,因为如果sympa_bulk失败,在重启sympa服务之前不会创buildPID文件,并且在sympa_bulk再次运行之前不会发生。
是否有办法监视这样的服务,获取所有子服务的警报消息,但是只能重新启动服务一次,即使所有子服务一次失败?
我find了两种可能的解决scheme。 两者都不是最佳的,但在我的情况下工作:
对于每个子服务,只检查PID文件是否存在,如果文件存在,则假定服务处于联机状态。 和以前一样,主要服务sympa
依赖于子服务:
check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" depends on sympa_bounced, sympa_bulk check file sympa_bounced with path /var/run/sympa/bounced.pid if does not exist then restart check file sympa_bulk with path /var/run/sympa/bulk.pid if does not exist then restart
restart
对文件没有任何作用,但是由于sympa
依赖于子服务,它将被重新启动。
使用更新的版本,您也可以执行命令并将parameter passing给命令:
check process sympa with pidfile /var/run/sympa/sympa.pid start program = "/etc/init.d/sympa start" stop program = "/etc/init.d/sympa stop" depends on sympa_bounced, sympa_bulk check program sympa_bounced with path "/usr/bin/pgrep --pidfile /var/run/sympa/bounced.pid" if does not exist then restart check program sympa_bulk with path "/usr/bin/pgrep --pidfile /var/run/sympa/bulk.pid" if does not exist then restart
与check file
类似, restart
操作不会为程序执行任何操作,但会强制服务sympa
重新启动。
对于旧的monit版本(例如5.4
,Debian Wheezy中的当前版本),不能将parameter passing给命令,因此您可以为每个执行/usr/bin/pgrep
服务编写一个简单的(单行)脚本参数。
使用这两种解决scheme,如果任何一个子服务失败,或者如果sympa
完全不运行, sympa
将重新启动一次 。
你应该能够使用depends
来解决它
所以像
check process sympa_bulk with pidfile /var/run/sympa/bulk.pid depends on sympa start program = "/bin/true" stop program = "/bin/true"