我使用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都为false?在这种情况下,是否可以保证进程不会被杀死(被进程或Linux OOM杀手杀死)?
发布于 2016-10-07 17:37:02
WIFSTOPPED也存在,但只有在父进程是ptrace:ing子进程(或者使用不同的waitpid标志)时才有可能。
我认为最好的方法是打印状态,并查看sys/wait.h中的位。不过,很难做到这一点。许多信息都被塞进了这个int中,很难弄清楚。看起来您粘贴的代码已经尝试这样做了,但是忘记了格式字符串中的%d。
https://stackoverflow.com/questions/39913885
复制相似问题