2017-12-17 20 views
0

C로 작성된 기본 라이브러리 (libidb)를 사용하는 Kafka 스트림에서 읽는 간단한 Python 스크립트가 실행됩니다. 스크립트는 이 흐름에서 계속적으로.Python - 제 3 자 모듈에 의해 잡힌 SIGTERM을 잡아주고 스크립트에 전파하는 방법

특정 디버그 목적으로 스크립트가 종료되면 사전을 JSON 형식으로 덤프해야합니다. 나는 모듈을 사용하여 SIGINT, SIGTERM을 스크립트에서 트랩하고 출력을 덤프하기 위해이 신호를 호출하는 함수를 정의했습니다. 그러나 문제는 내 스크립트가 대부분의 시간을 내가 읽었던 라이브러리를 사용하여 (읽기/쓰기 용으로) 신호를 잡는 데 걸리는데, 이는 이 아니고이 스크립트에 전파 된 것입니다. 결과적으로 내 시그널 핸들러는 여기에서 사용되지 않습니다. 잡힌 신호가 인터프리터에 전달되었는지 확인한 다음 해당 신호 처리기가 호출되는지 확인합니다.

idb은 표준 Python 패키지에서 사용할 수없는 내부 모듈입니다. 내가 CentOS의 7 Python 2.7.5을 사용하고

import signal 
import json 
import idb 

def dump_dict_to_JSON(): 
    __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) 
    f = open(os.path.join(__location__, 'dict_map'), 'w'); 
    f.write(json.dumps(my_dict)) 
    f.close() 



def idb_handler(): 
    print('I can do whatever with the message from stream') 

if __name__ == "__main__": 
    signal.signal(signal.SIGTERM, dump_dict_to_JSON) 
    signal.signal(signal.SIGINT, dump_dict_to_JSON) 

    db_consumer = idb.AsyncConsumer(istream, idb_handler) 

답변

0

커널에서 신호 당 하나의 신호 처리기가있다. 기본적으로 이것은 마지막으로 설치 한 것은 인터럽트를 보는 것을 의미합니다.

신호 유형 및 기타 상황에 따라 처리기가 데이지 체인 문제로 이전에 설치된 처리기를 호출하도록 설계 될 수 있습니다.

이것은 분명히 언급 된 라이브러리의 경우가 아닙니다.

임시 해결 방법으로 라이브러리가 초기화 된 후 핸들러를 설치해야하며 JSON이 덤프 될 때 처리기를 호출해야합니다.