如果在标准输出上检测到消息,则重新启动进程

如果在标准输出上检测到消息,则重新启动进程

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

相关内容