【发布时间】: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;
}
在哪种情况下WIFEXITED 和WIFSIGNALED 都可以为假?
是否保证在这种情况下进程没有被杀死(被进程或 Linux OOM 杀手)?
【问题讨论】:
-
孩子也可以恢复(
WIFCONTINUED(status)应该然后设置) -
@KarstenKoop 只有将 WCONTINUED 传递给 waitpid 才能得到,这里没有这样做
标签: c posix waitpid jsvc apache-commons-daemon