プロセスを監視し(Supervisordを使用するなど)、特定のテキスト行が標準出力に出力されたときにプロセスを再開する方法はありますか?
私の場合、確認する行は次のとおりです。
Net Exception [in file "src/ErrorHandler.cpp", line 38]
この行をstdoutに入れると、プロセスが再起動されるようになります。
どんな助けでも大変感謝します。
答え1
たとえば、grepを使用して監視する必要があるため、わかりstdout
ません。
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はサブシェルによって収集されます。その後、必要に応じて、パイプシェルはTERM信号をプログラムに送信し、サブシェルにプログラムを再起動させます。
答え2
expect
あなたにぴったりのツールです。読むman expect
。
expect
インタラクティブなプログラムとプログラミングの会話を共有しましょう。