質問:
- プロセスが強制終了された場合、この情報は、syslogなどの任意の場所(つまり、カーネル内)に記録されますか(または、syslog.confを記録するように構成できます)。
- 殺人者のPID、殺害された日時と理由の情報です
更新-皆さんは私にいくつかの洞察を与えてくれました、どうもありがとうございました|
Linuxカーネルがプロセスアカウンティング(CONFIG_BSD_PROCESS_ACT
)オプションを有効にしてコンパイルされている場合、accton(8)
コマンドを使用sa(8)
してプロセスアカウンティング情報の記録を開始し、を使用して記録された情報にアクセスできます。記録される情報には、信号番号を含む32ビットの終了コードが含まれます。
(このようなものは最近広く知られていません/使用されていますが、VAXの4.x Bsdの時代からまだ覚えています...)
修正: 要するに、OSカーネルはプロセスが強制終了されたかどうかを気にしません。これは、プロセスが何かをログに記録するかどうかによって異なります。この段階でカーネルが気にするのは、メモリを再利用することだけです。しかし、それをキャッチしてログに記録する方法について読んでください...
カフェとスティーブンCのコメントによると...
atexit
、コードで説明したように、それは..ooopsであるはずexit(0);
です。ありがとうcaf!オリジナル
キルシグナルをキャッチする最良の方法は、シグナルハンドラーを使用していくつかのシグナルを処理する必要があることです。それだけ SIGKILL
で十分ではなく、SIGABRT
(中止)、SIGQUIT
(ターミナルプログラムの終了)、およびSIGSTOP
SIGHUP
(ハングアップ)です。kill
これらの信号が一緒になって、コマンドラインでコマンドをキャッチします。/var/log/messages
シグナルハンドラーは、 (環境に依存する、またはLinuxディストリビューションに依存する)に格納されている情報をログに記録できます。詳細については、こちらを参照してください。
また、関数を使用してシグナルハンドラーを使用する方法の例については、ここsigaction
を参照してください。
また、関数の使用法を採用することをお勧めします。実行時atexit
にコードが終了すると、ランタイムはコマンドラインに戻る前に最後の関数を実行します。のリファレンスatexit
はこちらです。
C関数exit
を使用してatexit
実行すると、次の例のように、関数が適用された場所で関数ポインタが実行されます。-これをありがとうcaf!
示されているの使用例atexit
:
#include <stdlib.h> int main(int argc、char ** argv){ atexit(myexitfunc); / *開始、宣言の直後* / /*残りのコード*/0を返します。exit(0); } int myexitfunc(void){ fprintf(stdout、"さようなら残酷な世界...\ n"); }
これがお役に立てば幸いです、よろしく、トム。
OOMキラーが実行していない限り、プロセスに送信されたシグナルのログはわかりません。
を使用するsudo
と、ログに記録されます。それ以外に、強制終了されたプロセスは一部の情報をログに記録できます(極端な偏見で終了されている場合を除く)。カーネルをハックして信号をログに記録することもできます。
プロセスが殺された理由を記録することに関しては、私はまだ精神的なプログラムを見ていません。
カーネルハッキングは心の弱い人のためではなく、楽しいものです。kill(3)、sigsend(2)などが呼び出されたときに、printk(9)を使用して情報をログに記録するには、シグナルディスパッチルーチンにパッチを適用する必要があります。シグナルの処理方法の詳細については、「Linuxシグナル処理モデル」をお読みください。
独自のプログラムを作成している場合は、実際に死ぬ前に、killシグナルをキャッチしてログファイルに書き込むことができます。ただし、これはkill -9では機能せず、通常のkillでのみ機能します。
thisawayでいくつかの詳細を見ることができます。
プロセスがそれを経由しているkill(2),
場合、プロセスがすでにログに記録されていない限り、外部トレースはカーネルmodのみになります。とても簡単です。を実行するだけです。これは、で 出力を検索するprintk()
ようなものです。printf().
dmesg
プロセスがを介して取得している場合は、/bin/kill
ロギングを実行するラッパー実行可能ファイルをインストールするのは比較的簡単です。/bin/kill
ただし、killもbashに組み込まれているため、これ(を介したシグナル配信)はありそうにありません。
ちなみに、プロセスが強制終了された場合、シグナルはカーネルによってde wait(2)システムコールを介して親プロセスに通知されます。この呼び出しによって返される値は、子の終了ステータス(下位バイト)と、このプロセスが強制終了された場合の上位バイトのシグナル関連情報です。詳細については、 wait(2)を参照してください。