java - 在 Java 中处理 SIGCHLD 信号

标签 java linux bash signals

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

相关文章:

linux - BASH 脚本获取潜在用户数量

java - 构建签名 APK 失败 - 找不到 [android/content/Context] 的通用父类(super class)

java - 如何在 Okta Java SDK 中发送短信质询

java - 如何使用 javafx 隐藏或停用 TextField 和 Label

bash - 如何合并列表中同一行上出现的所有WAV文件?

python - Behave 测试运行程序在 Jenkins 上没有彩色输出

bash - shell 脚本: How to copy files with specific string from big corpus

java - 如何使 Eden Space 大小加倍 Tenured Space

linux - 替换大文件中的最后一个字符(整个文件是一行)

c - 程序在更新时自行重启