표준 출력에서 ​​메시지가 감지되면 프로세스를 다시 시작합니다.

표준 출력에서 ​​메시지가 감지되면 프로세스를 다시 시작합니다.

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

관련 정보