2014-02-25 3 views
2

내가 정기적으로 외부 명령을 호출하는 파이썬 프로그램을 만드는 오전에 신호를 무시. 외부 명령을 수행하려면 몇 초가 걸릴 수 있습니다 ( 초). I 심하게 SIGINT하는 신호 처리기를 추가하여 종단 외부 명령의 가능성을 저감 할. 기본적으로 SIGINT는 Python 프로그램을 종료하기 전에 명령이 실행될 때까지 기다리려고합니다. 문제는 외부 perogram이 가 갑자기 종료의 원인뿐만 아니라, SIGINT를 받고있는 것으로 보인다는 것이다. 나는 신호에 대한 파이썬 문서는 메인 스레드가 http://docs.python.org/2/library/signal.html에 따라 신호를 수신하는 언급 때문에 외부 스레드를 사용하여 명령을 호출하고 있습니다. 누군가 도와 드릴 수 있습니까? 여기 내 코드의 스텁이 있습니다. 외부 프로그램입니다/빈/잠을 상상해파이썬 : 백그라운드 프로세스

import sys 
import time 
import threading 
import signal 
def sleep(): 
    import subprocess 
    global sleeping 
    cmd = ['/bin/sleep', '10000'] 
    sleeping = True 
    p = subprocess.Popen(cmd) 
    p.wait() 
    sleeping = False 

def sigint_handler(signum, frame): 
    if sleeping: 
    print 'busy, will terminate shortly' 
    while(sleeping): time.sleep(0.5) 
    sys.exit(0) 
    else: 
    print 'clean exit' 
    sys.exit(0) 

sleeping = False 
signal.signal(signal.SIGINT, sigint_handler) 
while(1): 
    t1 = threading.Thread(target=sleep) 
    t1.start() 
    time.sleep(500) 

예상되는 동작 (10000 - N) 대기 그 프로그램이 시작 누르면 Ctrl + C N 초 후 될 것입니다 초 후 종료. 무슨 일이 일어나고있는 지 프로그램이 즉시 종료됩니다.

감사합니다.

답변

2

문제는 새로운 프로세스를 실행할 때 신호 처리기 수정하는 방법이다. POSIX에서 :

A child created via fork(2) inherits a copy of its parent's signal dis‐ 
positions. During an execve(2), the dispositions of handled signals 
are reset to the default; the dispositions of ignored signals are left 
unchanged. 

그래서 당신이해야 할 것입니다 :

  1. 는 SIGINT 신호
  2. 시작

을 원하는대로

  • 가 SIGINT 핸들러를 설정 외부 프로그램을 무시 그런 식으로 외부 프로그램은 SIGINT를 무시합니다. 물론

    ,이 스크립트가 SIGINT에 응답하지 것이다 (매우) 작은 시간 창을 떠난다. 그러나 그것은 당신이 살아야 할 일입니다. 예를 들어

    :

    sleeping = False 
    while(1): 
        t1 = threading.Thread(target=sleep) 
        signal.signal(signal.SIGINT, signal.SIG_IGN) 
        t1.start() 
        signal.signal(signal.SIGINT, sigint_handler) 
        time.sleep(500) 
    
  • +0

    감사 isedev! 지연된 응답으로 미안합니다. 다른 작업이 우선합니다. 솔루션이 제대로 작동하는 것처럼 보이지만, 어떤 이유로 든 스폰 된 프로세스가 여전히 신호를 수신하고 있습니다. 내 업데이트 된 메인 루프는 게시 한 것과 동일합니다. 내가 간과하고있는 Python 특정 복잡성이있을 수 있습니까? – user3349102