我有一个Java进程,它(重新)启动Linux进程,该进程生成两个守护进程和子进程。
(它是HAProxy的包装,HAProxy被配置为具有2个进程的守护程序)
每次重新启动时,进程表都有另外两个Zombie进程。
为了防止这些僵尸,我实现了以下措施:
final static SignalHandler _signalHandler = new SignalHandler() {
@Override
public void handle(Signal signal) {
LOG.info("Received signal: {}",signal.getName());
}
};
public HaproxyWrapper() {
Signal.handle(new Signal("CHLD"), _signalHandler);
LOG.info("Registered SIGCHLD signal handler");
}
我在输出中看到“Registered SIGCHLD”日志,但是没有看到“Received signal:SIGCHLD”。
我做错了吗?
另外,“可能的最简单的工作”-我可以创建一个名为start_haproxy.sh的shell脚本,该脚本将同时调用haproxy并处理SIGCHLD。如何在bash中处理SIGCHLD? (句柄->忽略)
谢谢。
最佳答案
我非常确定Java已经忽略了SIGCHLD,这就是为什么您不能捕获它。只有正在运行的进程会收到此信号,如果您使用Process.waitFor()
,则会通知您子进程已死亡。
僵尸进程是无法杀死的进程,也就是说,它们通常应该由于操作系统中的问题而死亡,它们应该在死亡之后仍然存在。我怀疑您担心孤立进程,即当您有一个其父已去世的进程时。
防止这种情况的最简单方法是让您的 parent 等待 child 的死亡。
BTW守护程序进程通常作为孤立进程运行。您确定这确实是个问题吗?
关于java - 用Java处理SIGCHLD信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27885884/