3

我正在使用Apache commons-daemon 的 jsvc在 Linux 上将 Java 程序作为守护程序运行。

守护程序“随机”崩溃,仅显示消息:

jsvc.exec error: Service did not exit cleanly

这是jsvc第 1142 行)jsvc-unix.c代码的相关部分:

while (waitpid(pid, &status, 0) != pid) {
    /* Waith for process */
}

/* The child must have exited cleanly */
if (WIFEXITED(status)) {
    status = WEXITSTATUS(status);

    // Clean exit code...
}
else {
    if (WIFSIGNALED(status)) {
        log_error("Service killed by signal %d", WTERMSIG(status));
        /* prevent looping */
        if (laststart + 60 > time(NULL)) {
            log_debug("Waiting 60 s to prevent looping");
            sleep(60);
        }
        continue;
    }
    log_error("Service did not exit cleanly", status);
    return 1;
}

在哪种情况下WIFEXITEDWIFSIGNALED两者都可以是假的?是否保证在这种情况下进程没有被杀死(被进程或 Linux OOM 杀手)?

4

1 回答 1

1

WIFSTOPPED也存在,但只有当父进程是 ptrace:ing 子进程(或使用不同的标志waitpid)时才有可能。

我认为您最好的选择是打印状态并查看 sys/wait.h 中的位。不过,要做到这一点非常困难。很多信息都被塞进那个 int 并且很难弄清楚。看起来您粘贴的代码已经尝试这样做,但忘记了%d格式字符串中的。

于 2016-10-07T09:37:02.327 回答