如何使用Monit监视多个进程的服务?

我正在尝试与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。 两者都不是最佳的,但在我的情况下工作:

  1. 对于每个子服务,只检查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依赖于子服务,它将被重新启动。

  2. 使用更新的版本,您也可以执行命令并将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"