Quero saber se existe uma maneira de ouvir um processo no Linux e unix - quando ele termina e qual é o código de saída do processo (script).
Não quero escrever um script que seja executado em X
segundos e verifique ps -ef | grep PID
se o processo ainda está ativo. Quero saber se existe uma maneira de o processo me notificar quando terminar e qual era o código de saída.
wait
funciona? Quanta CPU normalmente leva do sistema?wait
funciona. Eu sei que não é preciso uma quantidade notável de recursos do sistema. Você pode rever o código fonte aqui: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.defUma abordagem - reconhecidamente pesada - é usar
strace
:assistirá o processo com o PID 12345, interceptando nenhuma chamada do sistema (primeira
-e
) e nenhum sinal (segunda-e
). Depois que o processo sair regularmente, o valor da saída será impresso.Se o processo for finalizado por um sinal, o strace sairá silenciosamente (quando executado com as opções fornecidas acima). Você pode usar, por exemplo,
-e signal=kill
para alterar esse comportamento. Observe, no entanto, que-e signal=all
(ou, de maneira equivalente, a omissão da-e signal
opção) pode produzir uma grande quantidade de saída se os sinais forem recebidos e manipulados pelo programa.fonte
Encadeando a execução de "notificar"
Observe que se o processo sair inesperadamente
notify
, não será executadoConfigurando armadilhas
O processo é sinalizado por sinais de significado diferente e pode reagir adequadamente
Você não tem certeza de qual notificação você tem em mente. Em essência, pode ser qualquer coisa que toque uma "campainha", é claro. Um para muitos, por exemplo.
notify-send
dalibnotify
biblioteca.fonte
se seu processo for executado como deamon, considere usar upstart ou monit, eles são formas padrão:
http://www.alexreisner.com/code/upstart
http://mmonit.com/monit/
Eles podem monitorar processos, sair de códigos, reiniciar processos, escrever registros, ...
fonte
Com
ptrace()
você, pode anexar um rastreador a um processo (ou executar um novo), definir um gancho comPTRACE_O_TRACEEXIT
(linux> = 2.5.60) e dormir até a saída do processo e, em seguida,PTRACE_GETEVENTMSG
obter o status de saída.Aqui, uma implementação de amostra chamada stopper , verifiquei apenas com a
attach
opção e foram necessárias algumas alterações para fazê-lo funcionar (eventualmente, se necessário, postarei o código em algum lugar).fonte