我有一个 Java 进程,它(重新)启动一个 Linux 进程,它产生两个守护进程的子进程并死掉。 (它是 HAProxy 的包装器,配置为具有 2 个进程的守护进程)
每次重新启动时,进程表都会多出两个僵尸进程。 为了防止这些僵尸,我实现了以下措施:
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/