Linux:複数のプロセスを監視するウォッチドッグの作成


14

数年前、同僚がウォッチドッグプログラムのエレガントなソリューションを思い付きました。プログラムはWindows上で実行され、Windowsイベントオブジェクトを使用して、いくつかのアプリケーションのプロセスハンドル(PID)を監視しました。いずれかのプロセスが予期せず終了した場合、そのプロセスハンドルは存在しなくなり、ウォッチドッグに直ちに信号が送られます。ウォッチドッグは適切なアクションを実行してシステムを「修復」します。

私の質問は、Linuxでこのようなウォッチドッグをどのように実装するかということです。単一のプログラムで他の多くのPIDを監視する方法はありますか?


監視/監視プログラムのリストについては、プロセスが常に実行されていることを確認するもご覧ください
ジル 'SO-悪であるのをやめる'

stackoverflowも参照してください。stackoverflow.com/ questions
マイクペニントン

回答:


17

従来のポータブルで一般的に使用される方法は、親プロセスがその子を監視することです。

基本的なプリミティブはwaitwaitpidシステムコールです。子プロセスが停止すると、親プロセスはSIGCHLDシグナルを受信し、waitどの子が停止したかと終了ステータスを知るために呼び出す必要があることを伝えます。代わりに、親プロセスは、都合のよいときに無視SIGCHLDして呼び出すことを選択できますwaitpid(-1, &status, WNOHANG)

多くのプロセスを監視するには、同じ親からすべてを生成するか、目的のプログラムを呼び出して終了するのを待って終了を報告する単純な監視プロセスを介してそれらをすべて呼び出します(シェル構文:)myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe。Windowsの世界から来たのであれば、小さなプログラムが1つの特別なタスクを実行することはUnixの世界では一般的な設計であり、OSはプロセスを安価にするように設計されていることに注意してください。

多くのプロセス監視(スーパーバイザーとも呼ばれます)プログラムがあり、プロセスが終了したときに報告し、オプションでそれを再起動できます。さらにMonitSuperviseUpstartなど


+1、まさに私が探していたもの-このような詳細な答えをありがとう。
ジャスティンエティエ

0

この問題に対する私のアプローチは、initとその組み込みのrespawnディレクティブを使用して、実行する必要があるものをすべて開始/再起動することです。これが本来の目的であり、主な目的でした。場合によっては、プロセスが終了した後、スクリプトを実行してクリーンアップするか、プロセスの開始を準備する必要があります(ほとんどの場合、作業は同じです)。ほとんどの場合、execで終わるbashスクリプトはこれに最適です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.