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

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

我正在尝试使用 monit 监视邮件列表管理器 sympa。正在运行的 sympa 实例由用于执行列表管理不同任务的多个进程组成(例如,用于存档电子邮件的单独进程),但所有进程都使用单个 init 脚本启动/停止。

理想情况下,monit 应该在任何服务失败时提醒我,然后重新启动 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"
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,则 init 脚本将被执行多次,对我定义的每个服务执行一次(因为每个服务都失败了)。

我的第二种方法是定义依赖关系,只有当任何子服务失败时才发出警报:

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

但由于子服务未重新启动,主服务也不会重新启动。因此我认为可以通过将 start/stop 设置为以下方式来“伪造”重新启动/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 服务重新启动之前不会创建 PID 文件,并且在 sympa_bulk 再次运行之前不会发生这种情况。

有没有办法监视这样的服务,获取所有子服务的警报消息,但只需重新启动服务一次,即使所有子服务同时失败?

答案1

我找到了两种可能的解决方案。 这两种方法都不是最佳选择,但在我的场景中有效:

  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. 使用较新版本的 monit,您还可以执行命令并将参数传递给该命令:

    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 版本(例如,Debian Wheezy 中的当前版本),您无法将参数传递给命令,因此您可以为每个服务编写一个使用相应参数5.4执行的简单(单行)脚本。/usr/bin/pgrep

使用这两种解决方案,sympa重新启动一次如果任何子服务失败或者sympa根本没有运行。

答案2

你应该能够使用depends

所以就像

check process sympa_bulk
  with pidfile /var/run/sympa/bulk.pid
  depends on sympa
  start program = "/bin/true"
  stop program = "/bin/true"

相关内容