有时,我有一个流氓 Java 进程,它占用了我 100% 的 CPU 并使其温度升高约 30C(如果不杀死,通常会导致崩溃)。
问题是,我永远无法真正识别它(它有一长串参数和东西)或分析它,因为我必须如此快地杀死它。
我可以查看某种日志来查看我过去杀死的进程的身份吗?如果没有,有没有办法让我在下次出现时捕获该过程?
如果重要的话我是 OpenSuse 11.4。
答案1
不,默认情况下不会。存在过多的日志记录(尤其是当您开始冒险记录写入日志条目的操作时......)。
BSD 进程会计(如果有,请运行lastcomm
),如果处于活动状态,则记录所执行的每个命令的名称和一些基本统计信息,但不记录参数。
这审计子系统更通用,更灵活。安装audit
软件包并阅读SuSE审核指南(主要是关于规则),或者尝试
auditctl -A exit,always -F path=/usr/bin/java -S execve
或者:与其杀死它,不如kill -STOP
杀死它。这停止暂停进程,不问任何问题。您可以选择稍后恢复 ( kill -CONT
) 或终止 ( kill -KILL
)。只要进程仍然存在,您就可以检查其命令行 ( /proc/12345/cmdline
)、内存映射 ( /proc/12345/maps
) 等。
或者:将调试器附加到进程并暂停它。它就像这样简单gdb --pid 12345
(Java 进程可能有更好的选择);连接调试器会立即暂停进程(如果退出调试器,进程会收到 SIGCONT 并恢复)。
请注意,所有这些仅捕获操作系统级别的进程,而不是 JVM 线程。您需要求助于 JVM 功能来调试线程。