2012-02-10 4 views
1

현재 Python 웹 서버 응용 프로그램이 실행 중입니다. 응용 프로그램이 실행 중인지 확인하려면 cron 작업을위한 python 스크립트를 사용하고 싶습니다. 그렇지 않으면 응용 프로그램을 시작하십시오. cron 작업을 사용하여 python 스크립트가 실행 중인지 확인하십시오.

import os 

string = os.popen('ps aux') 
n = 0 
for line in string.readlines(): 
    if "python webserver.py" in line: 
    n+=1 
if n < 1: 
    os.system('python webserver.py') 

지금 스크립트가 응용 프로그램을 실행 한 :

나는 아래 다음과 같은 코드가 있습니다. 하지만 내가 원했던 것은 스크립트가 응용 프로그램을 시작하고 종료하고 응용 프로그램을 계속 실행하는 것입니다. 그렇게 할 수있는 방법이 있습니까? 미리 감사드립니다.

+0

대신 간단한 쉘 스크립트에서이 작업을 수행합니다. 명령 끝에서'&'문자를 사용하여 백그라운드에서 실행하십시오. – wim

답변

1

내가 다음과 유사한 쉘 스크립트로이 일을 좋아한다. 그것은 간단하고 오류의 가능성이 적습니다. 일반적으로 나는 이것을 잠시 잠시 루프에 넣지 만, cron은 잘 작동한다.

if [ -x myproc.pid ] ; then 
    pid=`cat myproc.pid` 
else 
    pid=1 
fi 
kill -0 $pid #check if process is still running 

당신이 볼 수 있듯이 프로세스가 시작될 때 PID를 파일에 기록해야합니다. 이렇게하면 ps 출력을 grepping하는 문제를 피할 수 있습니다. 장래에 새로운 프로세스 이름이 서버에 어떤 식 으로든 상관없이 항상 작동하는 정규 표현식을 얻는 것이 까다로울 수 있기 때문입니다. PID 파일은 확실하지 않습니다.

kill -0은 프로세스가 실행 중인지를 확인하는 약간의 방법으로 /proc에있는 디렉터리를 확인하는 것보다 간단합니다. 검사기가 루트가 아니기 때문에 pid=1이있는 행이 있으므로 프로세스에 신호를 보낼 수 없으면 kill 검사가 항상 실패합니다. 이것이 myproc이이 서버에서 처음 실행될 때를 나타냅니다. 즉, 검사 스크립트는 root (일반적으로 좋은 습관)으로 실행해서는 안되며 검사중인 프로세스를 실행하는 동일한 사용자로 실행해야합니다.

파이썬에서이 작업을 실제로 수행하려는 경우 os 모듈은 PID에 액세스 할 수 있으며 kill 메소드를 사용합니다. 그러나 쉘 종료 코드를 반환하지 않습니다. 대신 os.killtry - catch 블록에서 처리 할 수있는 예외 인 OSError을 발생시킵니다. 같은 원리가 시그널 0을 사용하여 프로세스가 존재하는지 여부를 감지하지만 프로세스가 죽었고 다른 프로세스의 pid가 같을 가능성이 희박하므로 try - catch에서이 경우를 처리하십시오.

2

웹 서버가 프로세스 ID를 파일로 작성한 다음 cron 작업을 읽고 프로세스가 실행 중인지 확인하도록하면 더 좋을 것이라고 생각합니다.

os.system을 사용하여 수동으로 시작하지 않고 프로세스 관리 (예 : 감독관, 신출내기 등)를 수행하는 일종의 프레임 워크를 사용하는 것도 유용합니다.

0

아마도 백그라운드에서 응용 프로그램을 시작하고 신호를 수신하지 못하게 할 수 있습니다.

는로 시스템 명령을 변경해보십시오 :

nohup python webserver.py & 
관련 문제