ランダムにクラッシュし続ける不安定なプログラムがあります。bashスクリプトを使用して実行を続けることができますが、その状態を監視する方法はありますか?ポーリングではなく、イベント駆動型です。
そして、オプションの質問ですが、モニタープロセスがその親プロセスでない場合、これはまだ可能ですか?
はい、それはまだ可能です。これを行うために独自のアプリケーションを作成する場合は、を使用する必要がありますptrace
。これにより、デバッガーとしてプロセスに接続し、特定のイベントを待機できます。ptrace
ブログで使って説明しました。ここでは、いくつかの例を使用して詳細を読むことができます:http: //purecode.pl/blog/ ?tag=ptrace
クラッシュするプロセスをフォークして実行し、SIGCHLDを取得して最初からやり直すと、ウェイクアップする単純なラッパーを作成できます。以下の概念コード:
volatile sig_atomic_t gotchld = 0;
void
sigchld_handler(int sig)
{
if (sig == SIGCHLD)
gotchld = 1;
}
signal(SIGCHLD, sigchld_handler);
for (;;) {
switch ((pid = fork()) {
case -1:
err(1, "fork");
case 0:
exec_my_crashy_program_here();
errx(1, "came back from exec!"); /* paranoia */
default:
printf("sleeping for pid %u\n", pid);
while (!gotchld)
select(0, NULL, NULL, NULL, NULL); /* sleep forever waiting for signal */
/* possibly do fancy stuff with the wait() family of functions */
gotchild = 0;
continue;
}
}
特別なことは何も必要ありません。子プロセスと親プロセスがシグナルを介してどのように相互作用するかについての基本的な知識だけです。
また、シグナルを直接扱ってからしばらく経ちましたので、コードが正しいか再確認してください。
bashスクリプトを使用してプロセスを開始すると、その状態が監視されます。スクリプトの実行は、プロセスが終了した後に再開され、終了コードを取得します。それはイベント駆動型です。
子以外のプロセスの監視に関しては、Yobとuser1442158はすでに合理的な提案を行っています。
プログラムが実行され続けることを保証しようとしているのか、それともデバッグしようとしているのかは、あなたの質問からは明らかではありません。
実行を継続しようとしている場合は、Monitを試してください:http://mmonit.com/monit/
inotifyまたは同様のサービスを試して、/ proc / PIDが削除されるのを監視できますか?