使用 Monit 通过 &disown 重新启动 shell 脚本

使用 Monit 通过 &disown 重新启动 shell 脚本

我有一个运行 C++ 后端邮件系统 (PluginHandler) 的 shell 脚本。我需要在 Monit 中监视此进程,并在失败时重新启动它。

剧本:

export LD_LIBRARY_PATH=/usr/local/lib/:/CONFIDENTAL/CONFIDENTAL/Common/
cd PluginHandler/
./PluginHandler

此脚本没有 PID 文件,我们通过执行来运行此脚本

./rundaemon.sh &disown

./pluginhandler 启动进程并开始登录到 /etc/output/output.log 我通过使用 [ps -f | grep PluginHandler] 识别进程 ID 来停止该进程,然后终止该进程。

我可以很好地检查 Monit 中的进程,但我认为如果进程没有运行,Monit 就会启动它,但它无法执行 &disown,因此进程在启动后立即结束。

这是 monitrc 文件中用于检查此过程的代码:

check process Backend
matching "PluginHandler"
if not exist
then alert
start "PATH/TO/SCRIPT/rundaemon.sh &disown"
alert [email protected] only on {timeout} with mail-format {subject: "[BLAH"}

我尝试通过如下修改脚本来阻止脚本终止,但这也不起作用。

export LD_LIBRARY_PATH=/usr/local/lib/:/home/CONFIDENTAL/production/CONFIDENTAL/Common/
cd PluginHandler/
(nohup ./PluginHandler &)
return

任何帮助编写适当的 Monit 规则来解决此问题都将不胜感激:)

答案1

不要使用 disown...

我不知道脚本的全部内容,但如果可能的话,您确实应该尝试使用 PID 文件。但无论如何,您都可以使用 Monit 来启动和停止该进程。

check process Backend
        matching "PluginHandler"
        start program = "/path/to/rundaemon.sh" as uid user
        stop program = "/usr/bin/pkill -f PluginHandler"

仅此一项即可确保进程正常运行。您可能希望在“匹配”字符串中添加更具体的内容。使用测试以monit procmatch <string>查看 Monit 将检测到什么。它只会监视匹配进程的第一次出现。

您可以使用 启动该进程monit start Backend并使用 停止它monit stop Backend,只要有一个优雅的方法来停止该脚本。

相关内容