![如果在标准输出上检测到消息,则重新启动进程](https://linux22.com/image/188463/%E5%A6%82%E6%9E%9C%E5%9C%A8%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA%E4%B8%8A%E6%A3%80%E6%B5%8B%E5%88%B0%E6%B6%88%E6%81%AF%EF%BC%8C%E5%88%99%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E8%BF%9B%E7%A8%8B.png)
有没有一种方法可以监视进程(例如使用supervisord),然后在标准输出输出特定文本行时重新启动进程?
就我而言,要检查的行是:
Net Exception [in file "src/ErrorHandler.cpp", line 38]
如果将此行放在标准输出上,我希望该过程重新启动。
任何帮助将不胜感激。
答案1
你需要监控stdout
,例如使用 grep,所以,我不知道,也许
PIDFILE=/tmp/.pid.$$
(
while true; do
./program &
echo $! > $PIDFILE
# echo "Program restarted at $( date )" >> /var/log/program.log
done
) | while read X; do
echo "$X"
if (echo "$X" | grep "search" > /dev/null); then
PID=$( cat $PIDFILE )
# echo "Found ${X} on $(date), PID ${PID}" >> /var/log/program.log
kill -TERM $PID
fi
done
程序program
连续运行,其输出和 PID 由子 shell 收集,然后如有必要,管道 shell 将向程序发送 TERM 信号并让子 shell 重新启动它。
答案2
expect
是适合您的工具。读man expect
。
expect
与交互式程序进行编程对话。