2

os.system(cmd)forループで実行しています。時々ハングするのでprocess=subprocess.pOpen(cmd)、forループで使用しようとしています。しかし、私は次のことを知りたいです:

  • sleep(60)使用してプロセスがまだ実行されているかどうかを確認した場合、process.poll()1 分後でも実際に実行されているプロセスとハングしたプロセスを区別するにはどうすればよいですか?

  • ハングしたプロセスを強制終了した場合、for ループは続行されますか、それとも終了しますか?

ありがとう!

4

2 に答える 2

4

プロセスがハングしているかどうかを判断する一般的な方法がわかりません。ロックの問題が原因でプロセスがハングした場合、0% の CPU を消費する可能性があり、ハングしていて機能していないと推測できる場合があります。ただし、無限ループでハングした場合、プロセスは CPU を 100% ビジー状態にする可能性がありますが、有用な作業は実行されません。また、ネットワーク上で通信しているプロセスがあり、タイムアウトが長い非常に遅いホストと通信している場合があります。これはハングしませんが、待機中に 0% の CPU を消費します。

一般に、サブプロセスがプロセス間通信を使用して「私はまだ生きている」ことを意味する信号を定期的に送信する、ある種の「ウォッチドッグ」システムをセットアップすることが唯一の希望だと思います。

サブプロセスとして実行しているプログラムを変更できない場合は、少なくともハングする理由を突き止め、ハングしたことを推測する方法を見つけられるかどうかを確認してください。おそらく、通常は CPU と I/O のバランスの取れた組み合わせになっていますが、ハングするとタイトな無限ループに入り、CPU 使用率が 100% になります。それは、それを殺して再起動する時が来たというあなたの手がかりになります。または、30 秒ごとにログ ファイルに書き込み、ファイルのサイズを監視して、ファイルが大きくならない場合は再起動することもできます。または、プログラムを「冗長」モードにして、動作中にメッセージを出力することもできます (stdoutまたはstderr) そしてあなたはそれらを見ることができます。または、プログラムがデーモンとして機能する場合は、アクティブにクエリを実行して、プログラムが動作しているかどうかを確認できます。たとえば、データベースの場合は、単純なクエリを送信して、成功するかどうかを確認します。

そのため、一般的な回答を提供することはできませんが、特定のプログラムがいつハングするかを検出する方法を見つけられるようになることを願っています。

最後に、考えられる最善の解決策は、ハングする理由を突き止め、問題を修正して、それ以上発生しないようにすることです。これは不可能かもしれませんが、少なくとも心に留めておいてください。プログラムがハングしなくなった場合は、プログラムのハングを検出する必要はありません。

PS「プロセスを監視する方法」をGoogleで検索して、そこから何か役立つアイデアが得られるかどうかを確認することをお勧めします。

于 2012-07-12T00:07:43.503 に答える
0

動作を停止したものを検出する一般的な方法は、ほぼ一定の間隔で信号を発信し、別のプロセスで信号を監視することです。モニターは、たとえば間隔の 2 倍の時間が経過しても信号が到着していないことを確認すると、プロセスを強制終了して再起動するなどのアクションを実行できます。

この一般的な考え方は、ソフトウェアだけでなくハードウェアにも適用できます。出力ビットからの AC 結合信号からコンデンサを充電するだけで、組み込みコントローラを再起動するために使用しました。単純な検出器がコンデンサを監視し、電圧がしきい値を下回った場合は、リセット ラインを Low に引き下げ、同時にコントローラが再起動するのに十分な時間コンデンサを充電したままにします。

ソフトウェアの原則も同様です。1 つの方法は、プロセスが間隔を置いて単純にファイルにアクセスすることです。モニターはファイルの変更時刻を定期的にチェックし、それが古すぎる場合はプロセスを強制終了して再起動します。

OPの場合、サブプロセスはステータスコードをファイルに書き込んで、作業がどれだけ進んだかを示すことができます。

于 2014-01-01T14:39:12.493 に答える