私は(並行して)サブプロセス(主にbashスクリプト)を生成するPythonアプリケーションを持っています。一部のスクリプトは他のスクリプトを呼び出す場合があります。アプリケーションとサブプロセスのターミネーションエッジケースを処理するための最良の方法を見つけようとしています。
アプリケーションを終了する必要がある場合、またはアプリケーションがを受信する場合は、すべてのサブプロセスとそれらが作成したすべてのプロセスをSIGTERM
終了する必要があります(SIGTERM
、、 )。このためのアプローチは、新しいプロセスグループとして開始し、終了の一部としてプロセスグループを強制終了することです()。wait
SIGKILL
killpg
サブプロセスのいずれかが指定された時間より長くかかる場合は、それらとそれらが作成した子プロセスを強制終了します。ここでのアプローチは、アプリケーションをプロセスグループリーダーとして設定することです。これにより、グループをkillpgし、それに依存して他のサブプロセスを強制終了できます。
難しいのは、これら2つのソリューションが互いに競合しているため、1つの要件しか満たすことができないようです。
したがって、最終的な考えはtcsetpgrpを使用することですが、私はそれについてあまり詳しくありません。つまり、インタラクティブ端末をシミュレートするようなものです。これは、アプリケーションを強制終了するとSIGHUP
(私が思うに)すべてのプロセスに送信されることを意味し、プロセスグループを使用して、時間がかかりすぎるサブプロセスの強制終了を管理できます。
これは良い考えですか、それとも私が見逃している他の提案はありますか?
ボーナスセクション:アプリケーションが経由SIGKILL
で強制終了された場合(このアプリケーションではときどき必要にSIGKILL
なりますが、回避する必要があることはわかっています...)、bashが送信するのと同じ方法でサブプロセスも強制終了するのは素晴らしいことです。SIGHUP
それが終了するときにそのプロセスに。