4

私は(並行して)サブプロセス(主にbashスクリプト)を生成するPythonアプリケーションを持っています。一部のスクリプトは他のスクリプトを呼び出す場合があります。アプリケーションとサブプロセスのターミネーションエッジケースを処理するための最良の方法を見つけようとしています。

アプリケーションを終了する必要がある場合、またはアプリケーションがを受信する場合は、すべてのサブプロセスとそれらが作成したすべてのプロセスをSIGTERM終了する必要があります(SIGTERM、、 )。このためのアプローチは、新しいプロセスグループとして開始し、終了の一部としてプロセスグループを強制終了することです()。waitSIGKILLkillpg

サブプロセスのいずれかが指定された時間より長くかかる場合は、それらとそれらが作成した子プロセスを強制終了します。ここでのアプローチは、アプリケーションをプロセスグループリーダーとして設定することです。これにより、グループをkillpgし、それに依存して他のサブプロセスを強制終了できます。

難しいのは、これら2つのソリューションが互いに競合しているため、1つの要件しか満たすことができないようです。

したがって、最終的な考えはtcsetpgrpを使用することですが、私はそれについてあまり詳しくありません。つまり、インタラクティブ端末をシミュレートするようなものです。これは、アプリケーションを強制終了するとSIGHUP(私が思うに)すべてのプロセスに送信されることを意味し、プロセスグループを使用して、時間がかかりすぎるサブプロセスの強制終了を管理できます。

これは良い考えですか、それとも私が見逃している他の提案はありますか?

ボーナスセクション:アプリケーションが経由SIGKILLで強制終了された場合(このアプリケーションではときどき必要にSIGKILLなりますが、回避する必要があることはわかっています...)、bashが送信するのと同じ方法でサブプロセスも強制終了するのは素晴らしいことです。SIGHUPそれが終了するときにそのプロセスに。

4

1 に答える 1

0

スクリプトを自己終了させる1つの可能性。

Perlには、アラームを設定できる構造があります。

このサイトの良い例はここにあります:

https://stackoverflow.com/questions/3427401/perl-make-script-timeout-after-x-number-of-seconds

Perl、x秒後にスクリプトをタイムアウトさせますか?

Pythonアラームタイムアウトスクリプトを検索する同様のヒットがあります。

https://stackoverflow.com/questions/1191374/subprocess-with-timeout

タイムアウト付きのモジュール「サブプロセス」の使用

これには、子プロセスのタイムアウトが親よりも短い限り、親が正常に回復できる可能性があるという副作用(利点またはバグ...)があります。

ただし、壁時間ではなくCPU時間でプロセスを制限する方がよい場合があります。このようにして、遠い子孫が親の時間を無駄にすることはありません。また、多くのプロセスが原因でシステム全体が遅い場合でも、サブプロセスの間に死の疫病が発生することはありません。

これは、bashスクリプトで次のように入力することで実行できます。

ulimit -t X 

ここで、xは必要なCPU秒数です。ただし、ほとんどのシステムでは、一方通行であることに注意してください。プロセスはそれ自体の制限を増やすことはできません。

于 2013-03-13T21:09:36.253 に答える