有没有一种方法可以监视进程(例如使用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
与交互式程序进行编程对话。