본문 바로가기
파이썬

파이썬 프로그램 파일 자동으로 재실행하기

by 야삐미얼 2023. 8. 16.

오늘은 24시간 파이썬을 실행해야할 때 혹시나 예기치 못한 상황으로 프로그램이 꺼질 때를 대비해보려고 합니다.

프로그램이 종료되면 직접 재기동하면 되지만 장소에 제약을 받게 됩니다.

장소의 제약 없이 원격이나 스스로 알아서 재실행이 된다면 얼마나 좋을까요?

 

바로 os 모듈을 사용해서 프로그램이 실행중인지 체크하는 스크립트가 있습니다.

def runcheck1():
    process_read = os.popen("ps -ef | grep haggistest1.py | grep -v 'grep'").readlines()
    # ps -ef 명령어를 이용해서 현재 프로세스를 출력한 후, 그 중 run24h.py 문자열이 포함된 줄만 모은다.
    # grep 명령어 자체도 프로세스에 나타나므로 grep -v를 이용해서 제외한다.
    
    check_process = str(process_read)
    # 문자열로 변환한다.
    
    text_location1 = check_process.find("haggistest1.py")
    
    # run24h.py가 몇번째 문자열인지 찾아낸다. 만약 문자열이 없으면, 즉 프로세스가 존재하지 않을 경우에는 -1을 반환한다.
    if text_location1 == -1:
        print("1번 프로그램이 종료되어 재실행합니다.")
        os.system("python haggistest1.py &")
    # 해당 프로그램을 다시 실행한다. 백그라운드에서 실행할 경우 &기호를 붙인다.

현재 실행중인 프로세스 목록을 출력하여 내가 원하는 파일의 명칭과 일치하는지 체크하는 로직입니다.

파일 명칭과 일치하는 프로세스가 없다면 자동으로 해당 파일을 os.system 을 활용하여 실행시켜주는 것이죠.

 

이를 활용하여 여러개의 프로그램도 동시에 실행시킬 수가 있습니다.

또한 24시간 동안 계속 프로세스가 유지되어야 하는 경우에 걱정없이 안심할 수 있습니다.

 

schedule 스케쥴 모듈을 통해서 원하는 시간마다 체크하여 잘 실행되고 있는지 확인할 수 있을 것이며, 

예기치 못한 상황이나 에러로 인해 프로그램이 죽는 경우 자동으로 실행되어 살릴 수 있습니다.

 

예를 들면 아래와 같이 구성하여 체크할 수 있겠죠.

import os
import schedule
import time

def runcheck1():
    process_read = os.popen("ps -ef | grep haggistest1.py | grep -v 'grep'").readlines()
    # ps -ef 명령어를 이용해서 현재 프로세스를 출력한 후, 그 중 run24h.py 문자열이 포함된 줄만 모은다.
    # grep 명령어 자체도 프로세스에 나타나므로 grep -v를 이용해서 제외한다.
    check_process = str(process_read)
    # 문자열로 변환한다.
    text_location1 = check_process.find("haggistest1.py")

# run24h.py가 몇번째 문자열인지 찾아낸다. 만약 문자열이 없으면, 즉 프로세스가 존재하지 않을 경우에는 -1을 반환한다.
    if text_location1 == -1:
        print("1번 프로그램이 종료되어 재실행합니다.")
        os.system("python haggistest1.py &")
    # 해당 프로그램을 다시 실행한다. 백그라운드에서 실행할 경우 &기호를 붙인다.

def runcheck2():
    process_read = os.popen("ps -ef | grep haggistest.py | grep -v 'grep'").readlines()
    # ps -ef 명령어를 이용해서 현재 프로세스를 출력한 후, 그 중 run24h.py 문자열이 포함된 줄만 모은다.
    # grep 명령어 자체도 프로세스에 나타나므로 grep -v를 이용해서 제외한다.
    check_process = str(process_read)
    # 문자열로 변환한다.
    text_location1 = check_process.find("haggistest.py")

# run24h.py가 몇번째 문자열인지 찾아낸다. 만약 문자열이 없으면, 즉 프로세스가 존재하지 않을 경우에는 -1을 반환한다.
if text_location1 == -1:
    print("haggistest 프로그램이 종료되어 재실행합니다.")
    os.system("python haggistest.py")
    # 해당 프로그램을 다시 실행한다. 백그라운드에서 실행할 경우 &기호를 붙인다.

schedule.every(60).seconds.do(runcheck1)
#1분마다 runcheck1 실행
schedule.every(10).seconds.do(runcheck2)
#10초마다 runcheck2 실행

while True:
schedule.run_pending()
time.sleep(1)

 

24시간동안 걱정없이 돌릴 수 있는 부분은 해결이 되었으니 이제는 원격으로 내가 원하는 시간에 재기동을 할 수 있도록 개선해보려고 합니다.

 

컴퓨터도 기계이기에 충분히 일했으면 조금의 휴식 시간이 필요한 법입니다.

PC에 직접 가지 않고 원격으로 재기동을 통해 효율적인 관리를 할 수 있도록 파악하여 다음 포스팅에 소개해드리려고 합니다.

 

오늘도 읽어주셔서 감사합니다. 

파이썬 자동 재실행에 대해 많은 도움 되셨으면 좋겠습니다.

댓글