3

私はこのようなことをしています

def exitHandler(self, *args):
    self.stopThreads()
    sys.exit(2)

そして、その関数をself.runに登録します(デーモン化されたプログラムで作業します)

   signal.signal(signal.SIGTERM, self.exitHandler)

self.stopThreads() が完了するまでに時間がかかることがあります。それらのスレッドによって開始されたサブプロセスを停止しています。シグナル ハンドラが複数回呼び出されると、次のようなエラー メッセージが表示されます。

Exception SystemExit: 2 in <bound method Popen.__del__ of <subprocess.Popen object at 0x929d10c>> ignored

無視された例外があっても、スレッドのすべてのプロセスが正常に終了します。私が間違っていることと、無視された例外エラーを取り除く方法に興味があります。

4

1 に答える 1

2

stopThreads()問題は、 or のどちらかの作業がsys.exit()再入可能ではないことと思われ、2 番目の SIGTERM によって、それらの一方または両方が途中で呼び出されます。

現在、SIGTERM が複数回配信されるのを防ぐことはできませんが、それに対応するようにロジックを作り直すことはできます。通常の (そして通常は正しい) アドバイスは、シグナル ハンドラーをリファクタリングして単純にフラグを設定し、メイン ループでそのフラグを確認することです。

def termHandler(self, *args):
    global flag_exit
    global exit_code

    flag_exit = True
    exit_code = 2


... in the main loop ...

    while not flag_exit:
        do_work()

    self.stopThreads()
    sys.exit(exit_code)
于 2013-07-18T16:39:52.797 に答える