Quando um processo daemoniza, ele se bifurca (pelo menos uma vez), o pai retorna imediatamente e o filho faz o trabalho.
Quando essa criança morre, ela não tem mais um pai. Ou melhor, foi adotado por init
(o processo de id 1). init
poderá obter seu status de saída.
No Linux, e desde o kernel 3.4, você pode alterar qual processo adotará os processos órfãos (para seus filhos e descendentes) usando o PR_SET_CHILD_SUBREAPER
prctl()
.
Então, como este Q & A muito semelhante, se no Linux 3.4+, você pode iniciar seu daemon sob um wrapper que se auto-denomina filho subreactor e fazer com que ele relate o status de saída de seus descendentes órfãos:
Aqui, usando perl
e codificando o valor da PR_SET_CHILD_SUBREAPER
prctl()
:
perl -MPOSIX -le '
require "syscall.ph";
syscall(&SYS_prctl,36,1) >= 0 or die "cannot set subreaper: $!";
if (!fork) {
exec @ARGV;
exit(127);
}
# now reporting on all children and grand-children:
while (($pid = wait) > 0) {
print "$pid: " . WEXITSTATUS($?)
}' your-daemon here