Solaris 10 上の Python 2.7.3
質問
- サブプロセスに内部の Segmentation Fault(core) 問題があるか、ユーザーが SIGTERM または SIGKILL を使用して外部でシェルからサブプロセスを強制終了すると、メイン プログラムのシグナル ハンドラが SIGTERM(-15) を処理し、親プログラムが終了します。これは本当ですか?それともPythonビルドが悪いですか?
背景とコード
最初にワーカー管理スレッドを生成する Python スクリプトがあります。次に、ワーカー管理スレッドが 1 つ以上のワーカー スレッドを生成します。メインスレッドでブロックできない他のことが進行中です。私の管理スレッドとワーカー スレッドは堅実です。私のサービスは再起動せずに何年も実行されますが、次のsubprocess.Popen
シナリオがあります。
ワーカー スレッドの run メソッドでは、次を使用しています。
class workerThread(threading.Thread):
def __init__(self) :
super(workerThread, self).__init__()
...
def run(self)
...
atempfile = tempfile.NamedTempFile(delete=False)
myprocess = subprocess.Popen( ['third-party-cmd', 'with', 'arguments'], shell=False, stdin=subprocess.PIPE, stdout=atempfile, stderr=subprocess.STDOUT,close_fds=True)
...
myprocess.poll()
関連情報 (ファイルが 1 GiB を超える可能性があります) が見つかるまでスキャンする必要がatempfile
あり、ユーザーの要求またはプロセスの実行時間が長すぎるためにプロセスを終了する必要があるため、プロセスの終了を確認するために使用する必要があります。探しているものが見つかったら、標準出力一時ファイルのチェックを停止します。外部プロセスが停止した後、ワーカー スレッドが終了する前にクリーンアップします。子の stdin ストリームでインタラクティブなものへの応答を挿入する必要がある場合に備えて、stdin PIPE が必要です。
私のメイン プログラムでは、SIGINT および SIGTERM ハンドラを設定してクリーンアップを実行します。シェルから実行している場合、メインの python プログラムが SIGTERM または SIGINT(Ctrl-C) で終了した場合です。
スレッドで子シグナルを処理するための確実な 2.x レシピを持っている人はいますか? ctypes sigprocmask など。
どんな助けでも大歓迎です。「公式」レシピまたは最高のハックを探しているだけです。
ノート
Python の制限付きビルドを使用しています。2.7.3 を使用する必要があります。third-party-cmd は、ソースを持っていないプログラムです。変更することはできません。