나는 무기한으로 계속 실행하고 싶은 Python 스크립트를 작성했습니다. 대부분의 시간 동안 잠을 자지만 가끔씩 일어나서 뭔가를 해야 합니다. EC2 인스턴스에서 실행해야 하며 이 작업을 수행하는 동안 터미널 연결을 끊어야 합니다.
나는 이것이 이상적인 솔루션이라고 생각합니다.
#!/bin/bash
while true; do
python monitor.py >>monitor.log 2>&1
echo "monitor.py exited with code $?. Respawning.." >&2
sleep 2
done
이 파일을 실행하고 monitor.sh
다음을 통해 다른 이름으로 저장합니다.
./monitor.sh >>monitor.log 2>&1 &
하루나 이틀 후에 돌아와서 다음을 실행하면:
ps aux | grep monitor
저는 보통 출력에 monitor.sh와 monitor.py가 보이는데,하지만 항상 그런 것은 아니다. 때로는 둘 다 보이지 않습니다. 따라서 두 프로세스 모두에서 어떤 일이 일어나고 있습니다.
예상되는 동작은 어떤 이유로(종료 코드 0 등) monitor.py가 종료되면 에코된 줄이 로그 파일에 나타나고 Python 스크립트가 다시 시작되어야 한다는 것입니다.
왜 안 돼? 아마도 여기서 일어나는 일은 내 스크립트가 때때로 중단된다는 것입니다.
&
쉘 스크립트를 실행할 때 터미널과의 연결을 끊기 위해 끝에 를 추가한 다음 로그아웃합니다. 이것이 문제의 일부일까요?
echo "monitor.py exited with code $?. Respawning.." >&2
특별히 직접 종료하지 않는 한( 를 사용하여 kill $pid_of_monitor.py
) 로그 파일에 결과가 표시되지 않습니다. 자체 과정을 실행하도록 하면 Python 스크립트가 실패했다는 메시지가 로그 파일에 표시되지 않습니다. 이것으로부터 어떤 결론을 이끌어내야 할지 모르겠습니다.