2016-10-07 1 views
2

Я запускаю программу Java как демон в Linux, используя Apache commons-daemon's jsvc.waitpid - В каких случаях оба WIFEXITED и WIFSIGNALED будут ложными?

Демон "случайно" падает только с сообщением:

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 как быть ложным? Гарантировано, что процесс не был убит в этом случае (процессом или убийцей OOM Linux)?

+0

Ребенок также может быть возобновлена ​​('WIFCONTINUED (статус)' должен затем быть установлен) –

+1

@KarstenKoop Вы получите только, что если вы передаете WCONTINUED к waitpid, что не делается здесь – nos

ответ

1

WIFSTOPPED существует, но это возможно только в том случае, если родительский объект ptrace: дочерний процесс (или с разными флагами - waitpid).

Я думаю, что лучше всего напечатать статус и посмотреть на бит в sys/wait.h. Однако довольно сложно это понять. В эту информацию добавляется много информации, и трудно понять ее. Похоже, что код, который вы вставили, уже пытается это сделать, но забыл %d в строке формата.

+0

Действительно, я перекомпилировать 'jsvc' так что он печатает статус в следующий раз, подождать и посмотреть ... – nicoulaj

Смежные вопросы