如何检查unix中的java进程是否被杀死?

如何检查unix中的java进程是否被杀死?

我有一个 Unix 上的 java 应用程序。该应用程序意外停止。我正在寻找问题所在。

我如何判断在 Unix 上启动的 java 进程是否正在被终止? (与kill -9 pid)我无法修改代码,我无法捕获。我可以用java修改启动-verbose。有东西正在杀死这个过程......

$JAVA_HOME/bin/java \
-verbose \
-classpath '../../lib/*:.:./config' com.xxx.xxx.core.xxxxApp instance:$INSTANCE

但它没有出现在日志中。还有其他方法吗?

答案1

正如 waltinator 在对您的问题的评论中建议的那样,您可以使用 shell 脚本运行您的进程。该脚本可以阻止等待进程终止,然后检查退出状态以了解故障模式。

通常,如果进程被信号终止,则存在状态为 128 加信号号。例如,如果有人kill -9对进程执行了 a,则退出状态将为 137 (128 + 9 = 137)。

例如,下面的脚本运行您的命令,并在响应信号而终止时打印一条消息:

#!/bin/bash

$JAVA_HOME/bin/java \
    -verbose \
    -classpath '../../lib/*:.:./config' com.xxx.xxx.core.xxxxApp instance:$INSTANCE

rc=$? # The $? variable has the exit status of the previous command


if [[ ${rc} -gt 128 ]]; then
    printf "Process terminated with signal %d\n" $((rc - 128))
fi

现在,如果我用来kill -9终止java进程,那么我会得到:

Process terminated with signal 9

答案2

由于某些问题,内核似乎正在终止该进程,例如,如果一个进程消耗了太多内存,那么内核内存不足(OOM) 杀手会自动杀死有问题的进程。您可以通过检查日志来确保是否有任何与内核相关的错误日志:

egrep -i 'killed process' /var/log/messages

或者

egrep -i -r 'killed process' /var/log

我建议检查系统日志并查看与您正在执行的java程序的进程相关的日志。

dmesg | grep -i kill

例如,此显示与终止相关的日志以检查您可以使用的完整日志:

dmesg | less

系统日志为您提供进程被终止的详细信息,是内存问题还是其他问题。

如果有人正在终止此进程,则需要超级用户,您可以/var/log/auth.log检查kill命令

相关内容