如何配置为“监视”进程重新启动后的监视?

如何配置为“监视”进程重新启动后的监视?

我有monit配置为在一对进程消耗过多 CPU 时终止它们,但一旦其中一个进程终止,monit summary即使操作系统重新启动该进程,也会报告该进程“未受监控”。

如何配置为“监视”进程重新启动后的监视?


check process soagent
    matching "soagent"
    stop program = "/usr/bin/pkill -9 soagent"
    if cpu > 20% for 1 cycles then stop
    if cpu > 20% for 1 cycles then alert

check process callservicesd
    matching "callservicesd"
    stop program = "/usr/bin/pkill -9 callservicesd"
    if cpu > 20% for 1 cycles then stop
    if cpu > 20% for 1 cycles then alert 

macOS 10.13.4,监控 5.25.2

答案1

问题是,您只是告诉它停止该进程,这也会停止监视它。

在这种情况下,最简单的解决方案是编写一个脚本,告诉 launchd 重新启动进程(不幸的是,我无法具体帮助这一点,我对 macOS 不太了解),然后在 monit 中使用单个条件为每个服务配置运行脚本,如下所示:

if cpu > 20% for 1 cycles then exec "/path/to/script"

exec子句在触发时仍会发送电子邮件警报,脚本将运行以重新启动进程/服务,然后 monit 将继续监视它,因为没有被告知停止监视它。

假设您采用这种方法,您也可以从定义中删除该行,因为除非您在服务上stop program运行,否则不会使用该行。monit stop

编辑以进一步澄清事情:

Monit 预计操作系统不会处理进程监督。换句话说,它假设它是唯一负责启动或停止进程的东西,因此当你告诉它停止某些东西时,它都会停止该进程,停止监视它,因为它假设没有任何东西会尝试再次启动它(因此有时在 Linux 上与 macOS 的 launchd 或 systemd 一起使用会有点痛苦)。

就您而言,您想要的是在进程使用过多处理能力时重新启动该进程,并在发生这种情况时通知您。您可以通过两种方式使用 monit 执行此操作:

  1. 为其定义一个start programand stop program,如果使用单独的进程管理程序作为您的 init 系统(macOS 就是这样),则该命令应该是告诉它启动或停止程序的命令,然后告诉 monit 在条件发生时重新启动进程添加一个条件来获取警报。在 macOS 上,您需要launchctl命令来处理重新启动。虽然这是首选且“正确”的方法,但使用起来launchctl有点痛苦(似乎假设没有人愿意手动重新启动服务),所以这不是我推荐的方法。
  2. 编写将触发重新启动的脚本,然后指定该脚本的路径作为exec条件的操作。 execactions 在当前版本的 monit 中隐式发送警报,因此在这种情况下您不需要指定任何警报条件。在您的情况下,第一个服务的“脚本”可以是以下内容:

    #!/bin/bash
    /usr/bin/pkill -9 soaagent
    

    然后第二个类似的事情。它唯一需要做的就是以某种方式触发 launchd 重新启动服务,它不需要自行重新启动。本质上,这种方法只是告诉 monit 触发重新启动,就像您在上面尝试执行的那样,它只是以一种稍微干净的方式执行此操作,从而获得您想要的结果。

相关内容