我有一个运行 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
,只要有一个优雅的方法来停止该脚本。