Bash 스크립트는 Python 스크립트가 화면에서 실행 중인지 확인합니다. 그렇지 않으면 다시 시작합니다.

Bash 스크립트는 Python 스크립트가 화면에서 실행 중인지 확인합니다. 그렇지 않으면 다시 시작합니다.

안녕하세요, 저는 현재 2개의 별도 화면에서 5개의 Python 프로세스를 시작한 다음 내 Python 스크립트가 현재 실행 중인지 확인하고 그렇지 않으면 다시 시작하는 bash 스크립트를 설정하려고 합니다. 총 5개의 Python 스크립트가 있습니다. 한 화면에서는 4개의 스크립트가 실행되고 있고, 다른 화면에서는 1개의 스크립트가 실행되고 있습니다. 저는 Linux와 스크립팅을 처음 접했기 때문에 작은 실수가 있었으면 좋겠습니다. 나는 현재 그것들을 모두 죽이고 그 중 하나라도 중지되면 화면에서 다시 시작하고 싶습니다. 이것은 내 bash 스크립트입니다.

#!/bin/bash
screen -dm -S "screen1" python script1.py
screen -dm -S "screen2" python script2.py & python script3.py & python script4.py & python script5.py
while true; do
   num_procs=$(pgrep -lf python | wc -l)
   if [ "$num_procs" != "7" ]; then
      pkill python
      screen -dm -S "fail" python script_failed.py
      sleep 10
      pkill python
      screen -dm -S "screen1" python script1.py
      screen -dm -S "screen2" python script2.py & python script3.py & python script4.py & python script5.py
   fi
   sleep 20
done

또한 내 코드가 실패하면 알림을 받아 실패한 이유를 추적할 수 있기를 원합니다. 이것이 실패한 이메일을 보내기 때문에 script_failed.py를 시작하는 이유입니다. 저는 5개의 Python 프로세스와 2개의 화면이 있으므로 num_procs = 7을 사용합니다. 어떤 이유로 화면도 num_procs에 포함됩니다. pgrep -af python의 출력에서 ​​볼 수 있듯이:

1146 SCREEN -dm -S screen1 python scrip1.py
1148 python script1.py
1154 python script3.py
1155 python script4.py
1156 python script5.py
1157 SCREEN -dm -S screen2 python script2.py
1158 python script2.py

코드가 도달하여 멈추는 위치를 확인하기 위해 해당 위치 주변에서 에코를 사용해 보았지만 초기 스플래시 화면을 완료한 후 에코가 작동하지 않는 것을 발견했습니다. 또한 Python 스크립트 1개만 종료하면 while 루프가 작동하지 않는 것 같지만 모든 스크립트를 종료하면 작동하고 다시 시작됩니다. 모든 프로세스를 종료하기 전에 분리된 화면 등에서 에코와 while 루프가 손실됩니까? 나는 또한 pkill이 때때로 Python 프로세스를 종료하지 않는다는 것을 알았습니다.

어떤 도움이라도 대단히 감사하겠습니다. 감사해요.

답변1

나는 아마도 아래에 설명된 일을 할 것입니다. 이렇게 하면 각 스크린 인스턴스에 대해 별도의 감시 스크립트가 생성되므로 스크린 인스턴스를 완전히 다시 시작할 필요가 없으며 .pid 파일을 사용하여 스크립트가 여전히 실행 중인지 더 정확하게 확인할 수 있습니다.

각 Python 스크립트(1-5)를 편집하여 .pid 파일을 만듭니다(예:https://stackoverflow.com/a/789383/5670331)

기본 스크립트를 편집합니다.

#!/bin/bash
screen -dm -S "screen1" watchdog1.sh
screen -dm -S "screen2" watchdog2.sh

watchdog1.sh

while true; do
    sleep 10
    ps up `cat /tmp/python_script_1.pid` >/dev/null && echo "Script 1 is running" || python script1.py &
done

watchdog2.sh

while true; do
    sleep 10
    ps up `cat /tmp/python_script_2.pid` >/dev/null && echo "Script 2 is running" || python script2.py &
    ps up `cat /tmp/python_script_3.pid` >/dev/null && echo "Script 3 is running" || python script3.py &
    ps up `cat /tmp/python_script_4.pid` >/dev/null && echo "Script 4 is running" || python script4.py &
    ps up `cat /tmp/python_script_5.pid` >/dev/null && echo "Script 5 is running" || python script5.py &
done

관련 정보