我在我的 ubuntu 机器上运行一个守护进程 java 进程:
java -cp (...) &> err.log&
该过程会随机运行一段时间,然后消失。日志中没有任何内容,err.log,没有创建 JVM 崩溃文件 (hs_err_*.log),什么都没有。我的两个问题是:
1)java进程在什么情况下会突然结束?
2)有没有办法知道进程发生了什么(知道PID)?UNIX 是否以某种方式保存有关已完成进程的信息?
1)java进程在什么情况下会突然结束?
当它自行退出时,但我猜你排除了这一点,或者当它被 SIGKILL 杀死时。如果您在 Linux 上,这可能是 oom 杀手。你看过系统消息日志吗?
2)有没有办法知道进程发生了什么(知道PID)?
通常不会,除非您配置一些跟踪工具来获取该信息
UNIX 是否以某种方式保存有关已完成进程的信息?
不,但根据您使用的 Unix 变体,这可能很容易添加。在您的示例中,您可以使用打印进程退出状态echo $?
如果是265
,则意味着进程被信号 9 ( =265-256
) 杀死。
我会编写一个简单的 shell 脚本,当 JVM 终止时它会以某种方式提醒我。也许发送一封带有 JVM 退出代码的电子邮件。
#!/bin/sh
# Launch JVM and wait...
java -cp ...
# do something with the exit code $?
# log it to a file or mail it yourself
也许,退出代码可能会揭示一些东西。
我会将它作为YAJSW的守护进程运行,因为它允许多种方式来监控内存等,具有重新启动选项,并且您还可以启用包装进程的日志,以便在出现问题时获得更多信息。