時々、CPUの100%を占有し、温度が約30°C上昇する不正なJavaプロセスがあります(通常、強制終了しないとクラッシュします)。
問題は、私はそれを本当に特定することも(パラメータなどの長いリストを取得することも)、それを分析することもできないということです。なぜなら、それをすぐに殺さなければならないからです。
私が殺した過去のプロセスのアイデンティティを確認するために見ることができる一種のログはありますか?そうでない場合は、次に表示されたときにそのプロセスをキャッチする方法はありますか?
重要な場合、私はOpenSuse11.4です。
承認された回答:
いいえ、デフォルトではありません。ロギングが多すぎるなどの問題があります(特に、ログエントリを書き込むアクションをロギングするリスクを冒し始めた場合…)。
BSDプロセスアカウンティング(ある場合は、lastcomm
を実行します )、アクティブな場合、実行されたすべてのコマンドの名前といくつかの基本的な統計を記録しますが、引数は記録しません。
監査サブシステムは、より一般的で柔軟性があります。 audit
をインストールします パッケージ化してSuSE監査ガイド(主にルールに関する部分)を読むか、試してみてください
auditctl -A exit,always -F path=/usr/bin/java -S execve
または:それを殺す代わりに、kill -STOP
それ。 STOPはプロセスを一時停止し、質問はありません。再開するオプションが表示されます(kill -CONT
)または終了(kill -KILL
) 後で。プロセスがまだ存在している限り、そのコマンドライン(/proc/12345/cmdline
)を調べることができます。 )、そのメモリマップ(/proc/12345/maps
)など。
または:デバッガーをプロセスに接続して一時停止します。 gdb --pid 12345
と同じくらい簡単です (Javaプロセスにはより良いオプションがあるかもしれません);デバッガーを接続すると、プロセスはすぐに一時停止します(デバッガーを終了すると、プロセスはSIGCONTを受け取り、再開します)。
これはすべて、JVMスレッドではなく、OSレベルのプロセスのみをキャッチすることに注意してください。スレッドをデバッグするには、JVM機能を使用する必要があります。