数年前、同僚はウォッチドッグプログラムのためのエレガントなソリューションを考え出しました。プログラムはWindows上で実行され、いくつかのアプリケーションのプロセスハンドル(PID)を監視するために Windowsイベントオブジェクト を使用しました。プロセスのいずれかが予期せず終了した場合、そのプロセスハンドルは存在せず、彼のウォッチドッグにすぐに通知されます。その後、ウォッチドッグは適切なアクションを実行してシステムを「修復」します。
私の質問は、Linuxでそのようなウォッチドッグをどのように実装しますか?単一のプログラムが他の多くのPIDを監視する方法はありますか?
従来のポータブルで一般的に使用されている方法は、親プロセスが子を監視することです。
基本的なプリミティブは wait
およびwaitpid
システムコールです。子プロセスが死ぬと、親プロセスはSIGCHLD
シグナルを受け取り、wait
を呼び出して、死んだ子とその終了ステータスを知る必要があることを通知します。代わりに、親プロセスはSIGCHLD
を無視して、都合のよいときにwaitpid(-1, &status, WNOHANG)
を呼び出すことを選択できます。
多くのプロセスを監視するには、同じ親からすべてを起動するか、目的のプログラムを呼び出して終了するまで待機し、終了について報告する単純な監視プロセスを通じてすべてを起動します(シェル構文:myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe
)。 Windowsの世界から来ている場合、1つの特殊なタスクを実行する小さなプログラムを持つことはUnixの世界では一般的な設計であり、OSはプロセスを安価にするように設計されています。
多くのプロセス監視(スーパーバイザーとも呼ばれます)プログラムがあり、プロセスが停止した場合にレポートし、オプションで再起動します。さらに、 Monit 、 Supervise 、 pstart 、…
この問題に対する私のアプローチは、initとその組み込みのrespawnディレクティブを使用して、実行する必要があるものをすべて開始/再起動することです。これが本来の目的であり、主な目的でした。場合によっては、プロセスが停止した後のクリーンアップ、またはプロセスが開始する準備をするためにスクリプトを実行する必要があります(ほとんどの場合、作業は同じです)。ほとんどの場合、execで終わるbashスクリプトはこれに適しています。