2009-10-21 6 views
1

내가데몬이 예기치 않게

while True: try: funny_code(); sleep(10); except:pass; 

루프에서이 코드

 def daemonise(): 
      from os import fork, setsid, umask, dup2 
      from sys import stdin, stdout, stderr 

      if fork(): exit(0) 
      umask(0) 
      setsid() 
      if fork(): exit(0) 

      stdout.flush() 
      stderr.flush() 
      si = file('/dev/null', 'r') 
      so = file('daemon-%s.out'%os.getpid(), 'a+') 
      se = file('daemon-%s.err'%os.getpid(), 'a+') 
      dup2(si.fileno(), stdin.fileno()) 
      dup2(so.fileno(), stdout.fileno()) 
      dup2(se.fileno(), stderr.fileno()) 
      print 'this file has the output from daemon%s'%os.getpid() 
      print >> stderr, 'this file has the errors from daemon%s'%os.getpid() 

스크립트가를 사용하여 daemonise 파이썬 스크립트를 가지고 죽는다. 몇 시간 동안 잘 돌아가고 예기치 않게 죽습니다. 그런 악마를 디버깅하는 방법, 오류 대몬.

MONIT 같은 프로세스를 시작하지 않고 [편집]

, 그들은 아래로 갈 때 내 다른 데몬을보고 다시 시작할 수 있습니다 파이썬에서 감시를 작성하는 방법이 있나요? (워치 독을 지켜 보는 사람)

답변

3

표준 데몬 프로세스 라이브러리에 대해 PEP 3141을 구현하는 라이브러리 인이 라이브러리에는 python-daemon을 사용해야합니다. 이렇게하면 실행중인 UNIX 유형에 관계없이 응용 프로그램이 모든 올바른 작업을 수행 할 수 있습니다. 바퀴를 재발 명할 필요가 없습니다.

0

내가 고객으로 사용한 내용은 daemontools입니다. 그것은 대몬화된 것을 실행하는 검증되고 잘 테스트 된 도구입니다.

포어 그라운드에서 실행하기 위해 데몬을 사용하지 않고 응용 프로그램을 작성하면됩니다. 그런 다음 daemontools 서비스 폴더를 만들고 시스템을 다시 시작할 때마다 그리고 지금부터는 응용 프로그램을 발견하고 자동으로 다시 시작합니다.

또한 로그 회전 및 항목을 처리 할 수 ​​있습니다. 지루하고 반복되는 많은 작업을 저장합니다.

+0

모니터링을 위해 monit과 같은 것을 추가 할 것입니다. 그러나 디버깅을 위해 너무 자주 실패하는 이유는 무엇입니까? daemontools ... 잘 djb에 의해 작성된, 그래서 나는 그것을 요구하는 구성 조심 오전. :) – agiliq

+0

@usaretech : 이번에는 안된다. "run"이라는 스크립트로 폴더를 만들면된다. 그것은 서비스입니다. – nosklo

1

왜 모든 예외 사항을 조용히 삼키고 있습니까? 예상치 못한 그것이 실패의 원인이되는 일이 될 수

while True: 
    try: 
     funny_code() 
     sleep(10) 
    except BaseException, e: 
     print e.__class__, e.message 
     pass 

뭔가를하지만, 맹목적으로 모든 예외를 무시하면 당신은 결코 알지 못할 것이다 : 예외이에 의해 체포되고 있는지 확인하십시오.

데몬 화 및 모니터링 프로세스를 위해 supervisord (매우 사용하기 쉬운 Python으로 작성)을 사용하는 것이 좋습니다. 슈퍼 바이저에서 실행하면 daemonise 기능을 사용할 필요가 없습니다.

관련 문제