我有一个在 CentOS 5.4 服务器上运行的 java 应用程序。
这些进程会随机地、似乎毫无原因地死亡,不是由于应用程序退出,也不是由于我终止它,而是由于某种似乎不留痕迹地终止的东西。
我记录了应用程序的所有输出,并将 stderr 和 stdout 发送到日志文件,但这些输出日志均不包含任何可以表明这些进程为何死亡的内容。
我的第一反应是使用内核级 OOM 杀手,但系统内存从来不会不足,并且通常在任何给定时间点都有 1GB 到 3GB 之间的可用内存。
我的问题是:有谁知道这可能是什么原因造成的,或者有谁知道我可以从哪里开始寻找?
谢谢。
答案1
使用以下方式启动我的 Java 应用程序
strace -tt -o strace.out <java command>
显示它正在被发送一个 SIGHUP 命令,该命令正在将其终止。事实证明,尽管我已将进程设置为在后台运行(通过附加&
到命令),但该命令仍然与创建它的线程绑定。
这意味着,对于 apache 执行的命令,只要创建它们的工作线程被回收,它们就会被终止;而对于手动执行的命令,只要我注销,它们就会被终止。
nohup
我通过在命令前面添加命令来解决这个问题,即
nohup java -jar /path/to/my/java.jar arguments &
答案2
进程可能会收到一些导致它们退出的信号,这可能是由于硬件故障(例如,内存故障可能导致段错误)。如果您在 syslog/dmesg 中看不到任何内容,请尝试启用核心转储。然后,您可以运行gdb
它们以了解发生了什么。