2009-05-23 7 views
5

프로그램이 충돌하거나 Python을 사용하여 실행 중이 아닌 것을 감지하고 다시 시작해야합니다. 필자는 반드시 부모 프로세스 인 파이썬 모듈에 의존하지 않는 메소드가 필요합니다.Python에서 시스템 자동 재시작

나는 기본적으로

ps -ef | grep process name 

을 수행하고 프로세스가 발견되지 않을 때 다른 시작 while 루프를 구현을 고려하고있다. 아마도 이것이 가장 효율적인 방법은 아닙니다. 나는 이미 파이썬에 익숙하다. 그래서 이미 파이썬 모듈이있다.

답변

5

왜 직접 구현합니까? daemon이나 데비안의 start-stop-daemon과 같은 기존 유틸리티는 수명이 긴 서버 프로세스를 실행하는 데 어려움을 겪을 가능성이 큽니다.

어쨌든 서비스를 시작할 때 해당 pid를 /var/run/<name>.pid에 넣은 다음 ps 명령에서 해당 프로세스 ID를 찾아 올바른 프로세스인지 확인하십시오. Linux에서는 /proc/<pid>/exe을보고 올바른 실행 파일을 가리키는 지 확인할 수 있습니다.

+0

모니터중인 프로그램 세트의 고유 한 속성으로 인해 데몬으로 만들 수 없습니다. 따라서 기존의 모니터링 방법을 사용할 수 없습니다. 또한 나는 외부 코드에 의존하기보다는 멋진 모듈 하나를 구현하는 것이 더 편하다고 느낄 수있는 특정 기능이 필요합니다. /proc/ Caedis

0

나는 직접 시도하지 않았지만 프로세스를 찾고 그에 대한 정보를 얻는 데 사용할 수있는 Python System Information 모듈이 있습니다. AFAIR 실행중인 프로세스를 검사하는 데 사용할 수있는 ProcessTable 클래스가 있지만 잘 문서화되지 않은 것으로 보입니다. ...

+0

감사를 필요로한다! 나는 이것을 조사 할 것이다. – Caedis

0

나는 명령 행 경로를 사용합니다. 당신이 매 2 ~ 2 초만 점검하는 한, 자원 사용은 10 년 미만의 시스템에서 사용 가능한 처리와 비교할 때 무의미해야합니다.

+0

아마도 ps 명령을 구문 분석하거나/proc 디렉토리를 검색 할 것입니다. – Caedis

3

초기화하지 마십시오. 운영 체제에는 시스템 리소스가 거의 필요없는이 작업을 수행 할 수있는 기능이 있으며 재현 할 수있는 것보다 훨씬 더 안정적으로 수행 할 수 있습니다.

고전 리눅스

inittab 파일 우분투 OS X가

+0

또한, 모니터링하는 프로세스의 고유 한 특성으로 인해 단순한 데몬과 다르게 처리해야합니다. 나는 단순히 프로세스를 재시작, 데이터베이스 잠금, 클라이언트 데이터 손상을 일으킬 수 없다. 서버 프로세스를 다시 시작하기 전에 데이터의 유효성을 검사해야합니다. 그래서 난 심각한 문제를 방지하기 위해 파이썬으로 사용자 정의 코드를해야합니다. – Caedis

+0

자동 재시작이 필요하거나 원하지 않습니다. 당신이한다면, 당신은 당신의 OS가 init 등을 통해 그것을하기를 원한다.그렇지 않으면 전체 질문과 제목이 의도와 반대를 표현합니다. – Dustin

1

을 반드시 smf있다

솔라리스 launchd에있다

(무례한)은 다음의 코드는이 검사를 /etc/event.d있다은/etc/보유 지정된 간격에서 주어진 프로세스를 재시작하고 다시 시작합니다.

#Restarts a given process if it is finished. 
#Compatible with Python 2.5, tested on Windows XP. 
import threading 
import time 
import subprocess 

class ProcessChecker(threading.Thread): 
    def __init__(self, process_path, check_interval): 
     threading.Thread.__init__(self) 
     self.process_path = process_path 
     self.check_interval = check_interval 

    def run (self): 
     while(1): 
      time.sleep(self.check_interval) 
      if self.is_ok(): 
       self.make_sure_process_is_running() 

    def is_ok(self): 
     ok = True 
     #do the database locks, client data corruption check here, 
     #and return true/false 
     return ok 

    def make_sure_process_is_running(self): 
     #This call is blocking, it will wait for the 
     #other sub process to be finished. 
     retval = subprocess.call(self.process_path) 

def main(): 
    process_path = "notepad.exe" 
    check_interval = 1 #In seconds 
    pm = ProcessChecker(process_path, check_interval) 
    pm.start() 
    print "Checker started..." 

if __name__ == "__main__": 
    main()