【问题标题】:waitpid - In which cases both WIFEXITED and WIFSIGNALED will be false?waitpid - 在哪种情况下 WIFEXITED 和 WIFSIGNALED 都会为假?
【发布时间】:2016-10-07 09:26:01
【问题描述】:

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

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

jsvc.exec error: Service did not exit cleanly

这是jsvc(in jsvc-unix.c line 1142)中代码的相关部分:

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 杀手)?

【问题讨论】:

  • 孩子也可以恢复(WIFCONTINUED(status)应该然后设置)
  • @KarstenKoop 只有将 WCONTINUED 传递给 waitpid 才能得到,这里没有这样做

标签: c posix waitpid jsvc apache-commons-daemon


【解决方案1】:

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

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

【讨论】:

  • 确实,我重新编译了jsvc,以便下次打印状态,拭目以待……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2022-09-25
  • 1970-01-01
  • 2017-01-10
  • 2014-02-24
相关资源
最近更新 更多