我有一个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/

10-10 17:39