2012-01-11 4 views
6

私はプロセスentryexitをキャプチャし、システム全体のログを維持したい(おそらくデーモンプロセス)。プロセスの進入/退出をキャプチャする可能性のあるソリューションはありますか?

/procinotifyを登録する可能性はないので、1つの方法は、/procファイルシステムを定期的に読み取り、リストを維持することでした。また、デスクトップアプリケーションの場合はdbusの助けを得ることができ、クライアントがデスクトップに登録するたびにキャプチャできます。

しかし、デスクトップ以外のアプリケーションの場合、私は定期的に/procを読むことから離れる方法を知らない。

ご提案をお願いいたします。

+0

おそらくカーネルモジュールを書く必要があります。私はあなたがユーザー空間からこれを正確に行うことはできないと思います。 –

+0

関連:http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-September/003367.html –

+0

ptrace(http://en.wikipedia.org/wiki/Ptrace)を使用すると、 gdbのようにsyscallsをトラップしてください。プログラムをrootとして実行する必要があります。私は**システム全体のためにそういったアプローチがいかに重くなるか分かりません。 –

答えて

1

実際にプロセスのすべてのエントリと終了をログに記録する場合は、カーネルにフックする必要があります。つまり、カーネルを変更するか、少なくともカーネルモジュールを書くことです。 "linux security modules"は確かに入り込むことができますが、私はそれが終了することが可能かどうかは分かりません。

一時的に終了することがあります(バイナリが静的にリンクされているか、何らかの理由で環境設定がされていない場合)。ライブラリを事前にロードするだけで簡単なオプションがあります。

Linuxダイナミックリンカには、環境変数LD_PRELOAD(see this question)が共有ライブラリに名前を付けると、そのライブラリが強制的に起動プロセスにロードされるという特徴があります。したがって、ライブラリを作成することができます。これは静的初期化でデーモンにプロセスが開始されたことを伝え、プロセスが終了したときにプロセスがそのことを知るようにします。

スタティック初期化は、C++でコンストラクタを使用してグローバルオブジェクトを作成すると簡単に行えます。ダイナミックリンカは、ライブラリがロードされたときに静的コンストラクタが確実に実行されるようにします。

また、プロセスが終了したときに対応するデストラクタを実行しようとするので、コンストラクタとデストラクタにプロセスを単に記録することもできます。しかし、プロセスがシグナル9(KILL)で消滅し、他のシグナルが何をするのかわからない場合は動作しません。

代わりに、デーモンがあり、コンストラクタでデーモンにプロセスの開始を伝え、プロセスが自身のプロセスを終了するときに通知するようにしてください。 1つの選択肢は、デーモンへのunix-domainソケットを開いて開いておくことです。プロセスが終了し、デーモンが気付くと、カーネルはプロセスを終了します。いくつかのプロセスでは、低い記述子番号(3,4,5)が空いていると仮定し、dup2と仮定している可能性があるので、ソケットに高い記述子番号を使用するためにいくつかの注意を払う必要があります。また、デーモンやシステム全体のファイル記述子を一般的に許可することを忘れないでください。

/procファイルシステムをポーリングするだけで、分割された状態でしか存在しない膨大な数のプロセスが見逃されることに注意してください。 UNIX上には本当に多くのものがあります。

2

恐らく移動するより安全な方法は、親として機能し、子をフォークするスーパープロセスを作成することです。子プロセスが停止するたびに、父はそれを見つけることができます。それはアーキテクチャがあなたのニーズに合っている場合の単なる考えです。

もちろん、の親プロセスのプロセスが実行できない場合は、カーネルに移動する必要があります。

3

あなたは/ procに言及していますので、ここにはLinuxシステムがあると仮定します。

acctパッケージをインストールします。 lastcommコマンドは、実行されたすべてのプロセスと実行時間を表示します。これはあなたが求めているものです。あなたのプログラムを "tail"/var/log/account/pacct(acct(5)で説明されている構造を参照)してください。しかし、それだけで終了の通知です。スタートアップを検出するには、システムプロセステーブルを定期的に調べる必要があります(実際に必要な場合)。

+0

+1はacctがここで言及されているという事実です。プロセスアカウンティング(Process Accounting:http://www.faqs.org/docs/Linux-mini/Process-Accounting.html)の実装です。 – cateof

0

ここで私たちが思いついた解決策の概要を説明します。

システムが監視できるすべての可能なアプリケーションの構成ファイルを読み込むプログラムを作成しました。このプログラムは構成ファイルを読み込み、コマンドラインインターフェイスを使用してプログラムを起動または停止できました。プログラム自体は、アプリケーションを実行中であるとマークした共有メモリにテーブルを格納していました。誰もがアクセスできるインターフェースは、これらのプログラムの状態を得ることができます。このプログラムには、電子メール/ページングまたは警報を発する警報システムもありました。

このソリューションはカーネルに変更を必要としないため、痛みの少ないソリューションです。

これが役に立ちます。

関連する問題