2017-12-17 9 views
0

私はC言語で書かれた基礎となるライブラリ(libidbと呼ぶ)を使用するKafkaストリームから読み込む単純なPythonスクリプトを実行しています。この流れから連続的に。Python - サードパーティのモジュールでキャッチされたSIGTERMをトラップしてスクリプトに伝播する方法

特定のデバッグ目的のために、スクリプトが終了するときに辞書をJSON形式でダンプする必要があります。私はsignalモジュールを使用してSIGINTSIGTERMをスクリプトからトラップし、これらのシグナルを呼び出して出力をダンプする関数を定義しました。しかし、問題は私のスクリプトは、私が参照していたライブラリを使用して(読み取り/書き込みの)ほとんどの時間を費やして、信号を捕まえることになります。ではなく、がスクリプトに伝播しました。その結果、私のシグナルハンドラはここでは使用されません。捕捉されたシグナルがインタプリタに伝播され、対応するシグナルハンドラが呼び出されるようにするにはどうすればよいですか。

idbは、標準のPythonパッケージでは利用できない内部モジュールです。

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) 

私は、カーネル内の信号ごとに1つだけのシグナルハンドラがありCentOSに7

答えて

0

Python 2.7.5を使用しています。基本的には、最後にインストールされたものが割り込みを見ることを意味します。

ハンドラは、以前にインストールされたハンドラをデイジーチェーンの問題で呼び出すように設計されている可能性があります。

これは、明らかに上記のライブラリに当てはまりません。

回避策として、ライブラリが初期化された後にハンドラをインストールし、おそらくJSONがダンプされたときにハンドラを呼び出す必要があります。

関連する問題