2012-05-11 3 views
0

데몬으로 실행하는 Jython 스크립트가 있습니다. 시작되어 서버에 로그인 한 다음 처리 할 항목을 확인하고 처리 한 다음 5 초 동안 대기하는 루프로 이동합니다.데몬 프로세스를 중지하는 올바른 방법

5 분마다 점검하여 프로세스가 실행 중인지 확인하고 그렇지 않은 경우 다시 시작하는 cron 작업이 있습니다.

또 다른 cron 작업을 통해 하루에 한 번씩 프로세스가 다시 시작됩니다. 때로는 서버에 대한 데몬의 연결이 망가 지기도하고 때가 언제인지를 알 수 없기 때문에이 작업을 수행합니다.

이 "솔루션"에 대한 문제는 프로세스를 죽이고 다른 프로세스를 시작하는 2 차 크론 작업입니다. 그것은 자고있는 동안 살해 당하면 괜찮은 것이지만 죽을 때 물건을 처리하는 중일 때 악질적 인 일이 발생할 수 있습니다.

데몬 프로세스를 중지하는 올바른 방법은 무엇입니까? 그냥 죽이는 대신 무엇입니까?

일반적으로 파이썬이나 자바에서 표준 방식이 있습니까? 앞으로는 자이 썬 대신 순수한 파이썬으로 이동할 것입니다.

감사

+0

"데몬과 서버의 연결이 때때로 엉망이되어 버린다"는 것은 무엇을 의미합니까? – Jordan

답변

1

먼저 프로세스를 종료하고 자이 썬 스크립트에 의해 신호를 수신 할 때 SIGKILL를 보내기 전에 SIGTERM을 보낼 수 있습니다.

예를 들어 스크립트로 수신하여 처리 할 수있는 SIGTERM을 보내면 지정된 기간 내에 아무 것도 발생하지 않으면 SIGKILL을 보내고 강제로 프로세스를 강제 종료 할 수 있습니다.

이벤트 처리에 대한 자세한 내용은 signal 모듈 설명서를 참조하십시오. here에서

#!/usr/bin/env python 

from signal import signal, SIGTERM 
from sys import exit 
import atexit 

def cleanup(): 
    print "Cleanup" 

if __name__ == "__main__": 
    from time import sleep 
    atexit.register(cleanup) 

    # Normal exit when killed 
    signal(SIGTERM, lambda signum, stack_frame: exit(1)) 

    sleep(10) 

을 촬영 : 또한

편리 할 수있다 예 (atexit 후크를 사용).

+0

감사 ... 이것은 자이 썬에서도 마찬가지다. –

0

이렇게하는 일반적인 Linux 유형 방법은 걸려있는 장기 실행 프로세스에 신호를 보내는 것입니다. 파이썬의 내장 신호 라이브러리로 이것을 처리 할 수 ​​있습니다.

http://docs.python.org/library/signal.html

그래서, 당신은 당신의 2 응용 프로그램에서 첫 번째 응용 프로그램에 SIGHUP을 보내, 당신이 그것을 다시 부팅 확인의 상태에있어 여부에 따라 처음에 그것을 처리 할 수 ​​있습니다.

+0

감사! petr의 예제는 "그냥 작동합니다"하지만 문제가 발생하거나 지루해지면 그 문서를 참조 할 것입니다 ;-) –

관련 문제