Existe uma maneira de ouvir o processo?

9

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 Xsegundos e verifique ps -ef | grep PIDse 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.

Nir
fonte

Respostas:

3

Bash faz isso por você. Ele o notificará quando o processo terminar, devolvendo o controle e armazenará o status de saída na variável especial $?. É mais ou menos assim:

someprocess
echo $?

Consulte o manual do bash sobre parâmetros especiais para obter mais informações.

Mas suponho que você queira fazer outro trabalho enquanto aguarda. No bash, você pode fazer assim:

someprocess &
otherwork
wait %+
echo $?

someprocess &iniciará o processo em segundo plano. Isso significa que o controle retornará imediatamente e você poderá realizar outro trabalho. Um processo iniciado em segundo plano é chamado de trabalho no bash. waitaguardará a conclusão do trabalho especificado e retornará o status de saída desse trabalho. Os trabalhos são referenciados por %n. %+refere-se ao último trabalho iniciado. Consulte o manual do bash sobre controle de tarefas para obter mais informações.

Se você realmente precisa do PID, também pode fazê-lo assim:

someprocess &
PID=$!
otherwork
wait $PID
echo $?

$! é uma variável especial que contém o PID do último processo em segundo plano iniciado.

lesmana
fonte
E como waitfunciona? Quanta CPU normalmente leva do sistema?
Nir
1
Eu não sei exatamente como o bash waitfunciona. 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.def
Lesmana
6

Uma abordagem - reconhecidamente pesada - é usar strace:

$ strace -e trace=none -e signal=none -p 12345

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=killpara alterar esse comportamento. Observe, no entanto, que -e signal=all(ou, de maneira equivalente, a omissão da -e signalopção) pode produzir uma grande quantidade de saída se os sinais forem recebidos e manipulados pelo programa.

Ansgar Esztermann
fonte
4
  1. Encadeando a execução de "notificar"

    $ process; notify $? &

    Observe que se o processo sair inesperadamente notify, não será executado

  2. Configurando armadilhas

    O processo é sinalizado por sinais de significado diferente e pode reagir adequadamente

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT

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-sendda libnotifybiblioteca.

$ process; notify-send "process finished with status $?" &
Miroslav Koškár
fonte
1

Com ptrace()você, pode anexar um rastreador a um processo (ou executar um novo), definir um gancho com PTRACE_O_TRACEEXIT(linux> = 2.5.60) e dormir até a saída do processo e, em seguida, PTRACE_GETEVENTMSGobter o status de saída.

Aqui, uma implementação de amostra chamada stopper , verifiquei apenas com a attachopção e foram necessárias algumas alterações para fazê-lo funcionar (eventualmente, se necessário, postarei o código em algum lugar).

Alex
fonte