프로세스를 모니터링하고(예: 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
대화형 프로그램과 프로그래밍 대화를 나눠보세요.