24시간 멈추지 않고 계속 가동되어야 하는 파이썬 프로그램이 있는데 종종 죽어버릴 때가 있다. 그래서 해결책을 연구하다가 그 중의 한가지 방법인 크론을 이용하는 방법을 기록해 두고자 한다.
먼저 무한루프로 실행되는 run24h.py라는 간단한 프로그램을 작성한다.
import time
while True:
print ('Hello World')
time.sleep(5)
5초마다 계속 헬로월드를 출력해주는 프로그램이다.
다음은 이 파이썬 프로그램이 중단되었을 경우, 프로세스가 살아있는지 검사를 해서 다시 실행하는 코드이다. 편의상 이 프로그램은 runcheck.py라고 하자.
import os
process_read = os.popen("ps -ef | grep run24h.py | grep -v 'grep'").readlines()
# ps -ef 명령어를 이용해서 현재 프로세스를 출력한 후, 그 중 run24h.py 문자열이 포함된 줄만 모은다.
# grep 명령어 자체도 프로세스에 나타나므로 grep -v를 이용해서 제외한다.
check_process = str(process_read)
# 문자열로 변환한다.
text_location=check_process.find("run24h.py")
# run24h.py가 몇번째 문자열인지 찾아낸다. 만약 문자열이 없으면, 즉 프로세스가 존재하지 않을 경우에는 -1을 반환한다.
if ( text_location == -1 ):
print("Process not found!")
os.system("python3 run24h.py &")
# 해당 프로그램을 다시 실행한다. 백그라운드에서 실행할 경우 &기호를 붙인다.
print("Program restarted!")
else:
print("Process exists. Location is",text_location)
먼저 ps명령어로 현재 프로세스 전체를 불러온 후, grep으로 찾고자 하는 프로세스만 걸러낸다. 그리고 파이썬의 find명령어를 이용해서 해당 프로세스(여기서는 run24h.py)가 포함된 문자열을 찾고, 만약 없다면 프로세스가 죽었다고 판단해서 다시 실행시키는 구조이다.

요즘 VScode를 이용하여 파이썬 코드를 작성하고 있다.
이제 크론(CRON)을 이용해서 1분마다 runcheck.py를 실행시켜 줄 예정이다. /etc/crontab의 마지막줄에 다음과 같이 추가시켜 준다. 사용자 계정은 ichu이고, 파이썬 코드는 run24h.py와 runcheck.py 둘다 사용자의 홈디렉토리(/home/ichu)에 있다고 가정하자.
* * * * * ichu cd /home/ichu;python3 runcheck.py
만약 시스템 부팅과 동시에 run24h.py가 실행되도록 하면 다음줄도 함께 추가해 주자.
@reboot ichu sleep 60;cd /home/ichu;python3 run24h.py
부팅과 동시에 곧바로 파이썬 프로그램을 실행하려고 하면 작동이 안되는 경우가 많아서, sleep명령어를 이용해서 60초 정도의 딜레이를 주어야 한다.
감사합니다. 잘 써보겠습니다.
파이팅입니다.ㅎㅎ