2 votes

waitpid - Dans quels cas WIFEXITED et WIFSIGNALED seront tous deux faux ?

J'exécute un programme Java en tant que démon sur Linux en utilisant jsvc d'Apache commons-daemon .

Le démon se bloque "aléatoirement" avec un seul message :

jsvc.exec error: Service did not exit cleanly

Voici la partie pertinente du code dans jsvc ( sur jsvc-unix.c ligne 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;
}

Dans quel cas WIFEXITED y WIFSIGNALED les deux sont-elles fausses ? Est-il garanti que le processus n'a pas été tué dans ce cas (par un tueur de processus ou d'OOM Linux) ?

1voto

Art Points 6040

WIFSTOPPED existe aussi, mais ce n'est possible que si le parent est en train de ptracer le processus enfant (ou avec des drapeaux différents de ceux du processus enfant). waitpid ).

Je pense que votre meilleure chance est d'imprimer le statut et de regarder les bits dans sys/wait.h. C'est assez difficile de le faire correctement. Il y a beaucoup d'informations dans cet int et c'est difficile de s'y retrouver. Il semble que le code que vous avez collé essaye déjà de faire cela, mais a oublié la fonction %d dans la chaîne de format.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X