我正在使用 monit 来监控多个进程。这些过程包括乘客实例和我编写的用于为乘客实例生成 pidfile 的守护程序。 Monit 将启动这些过程没问题。它不会阻止他们。以下是守护程序的 Monit 配置:

check process passenger_monitor with pidfile <%= passenger_monitor_pid %>
   group <%= application %>
   start program = "/bin/su - rails_apps -c 'source /home/rails_apps/.rvm/scripts/rvm; /home/rails_apps/passenger_monitor.rb'"
   stop program = "/bin/kill `/bin/cat <%= passenger_monitor_pid %>`"

它是一个通过 capistrano 生成的 erb 模板。如果我以 root 身份在最小环境下通过终端运行 stop 命令,那么它可以工作,但是当我请求 Monit 停止进程时,我收到以下错误:
[ADT Sep 17 10:38:31] error    : 'passenger_monitor' failed to stop

我已经尝试了我能想到的一切。我找不到或生成停止命令输出的任何日志。

最佳答案

尝试停止使用的服务时我遇到了同样的问题

stop program = "/bin/kill `/bin/cat /var/run/pusher.pid`"

您可以打开 -Iv 标志以查看调试输出:
monit -Iv

或者您可以在 monit 在后台运行时手动验证:
monit validate

他们都显示
'api-pusher-service' stop: /bin/kill
kill: can't find process "`/bin/cat"
kill: can't find process "/var/run/pusher.pid`"

这为我解决了问题
stop program = "/bin/bash -c '/bin/kill `/bin/cat /var/run/pusher.pid`'"

关于passenger - Monit 不会用 kill 命令停止脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12461432/

10-15 13:14