実行中のすべてのプロセスを監視し、sigsegvが原因でこれらのプロセスのいずれかがクラッシュしたときにログファイルに書き込むLinux用のc++プログラムを作成したいと思います。
これを行うことは可能ですか?もしそうなら、C ++でそれを実装するために何を学ぶべきですか?
実行中のすべてのプロセスを監視し、sigsegvが原因でこれらのプロセスのいずれかがクラッシュしたときにログファイルに書き込むLinux用のc++プログラムを作成したいと思います。
これを行うことは可能ですか?もしそうなら、C ++でそれを実装するために何を学ぶべきですか?
システム上のすべてのプロセスを監視しようとするのは面倒です。特に SIGSEGV に関心がある場合は、代わりにコア ダンプ ハンドラーとして自分自身をインストールすることを検討してください。コア ダンプを無効にするように要求したプロセス ( ) はキャッチされませんulimit -c 0
が、他のすべてのプロセスは取得されます。
echo "|usr/local/sbin/crashcollector" >/proc/sys/kernel/core_pattern
/usr/local/sbin/crashcollector
プロセスがクラッシュするたびに、標準入力のコア ダンプで呼び出されるようになりました。このプログラムは、コア ダンプの保存やその他の通知など、必要なことは何でも実行できます。
すべてのプロセスのクラッシュ イベントをキャッチできると思います。ptrace の使用はアプローチですが、非常に複雑です。すべてのプロセスをトレースし、後で作成される新しいプロセスにアタッチする必要があり、パフォーマンスが低下します。
フックですべてのプロセスのクラッシュ イベントをキャッチできますcoredump
。
echo "|yourcoredumphook" > /proc/sys/kernel/core_pattern
これにより、コアダンプ フックが有効になり、プロセスが終了すると、yourcoredumphook
stdin を介してコアダンプが送信されてルートとして開始されるため、コアダンプを分析して終了したプロセスを特定できます。
おそらくこれに使用したいと思うでしょうptrace
。この質問を見てください:
Linux シグナルを傍受する方法は? (C)
すべてのプロセスに対してこれを行うには、init の再実装、またはptrace
各プロセスを呼び出すために sys ディレクトリを監視するシステムが必要になると思います。