我正在尝试使用 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
我找到了两种可能的解决方案。 这两种方法都不是最佳选择,但在我的场景中有效:
对于每个子服务,仅检查 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
依赖于子服务,它将重新启动。使用较新版本的 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"