我使用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杀手)不会杀死进程?
答案 0 :(得分:1)
WIFSTOPPED
也存在,但只有在父级是ptrace的情况下才有可能:子进程(或使用不同的标志到waitpid
)。
我认为最好的办法是打印状态并查看sys / wait.h中的位。虽然很难做到这一点。很多信息都被填入了这个内容中,很难弄明白。看起来您粘贴的代码已经尝试这样做,但忘记了格式字符串中的%d
。