Existe uma maneira de ouvir o processo?

8

Eu quero saber se existe uma maneira de ouvir um processo no Linux & unix - quando termina e qual é o código de saída do processo (script).

Eu não quero escrever um script que execute X segundos e verifique por ps -ef | grep PID se o processo ainda estiver ativo. Eu quero saber se existe uma maneira que o processo irá me avisar quando terminar e qual foi o seu código de saída.

    
por Nir 15.08.2013 / 13:13

5 respostas

3

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

someprocess
echo $?

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

Mas eu suponho que você queira fazer outro trabalho enquanto espera. 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á fazer outro trabalho. Um processo iniciado em segundo plano é chamado de job no bash. wait esperará que o trabalho especificado termine e retorne o status de saída desse trabalho. As tarefas são referenciadas por %n . %+ refere-se ao último trabalho iniciado. Consulte o manual do bash sobre o controle do trabalho para obter mais informações.

Se você realmente precisa do PID, você também pode fazer assim:

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

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

    
por 15.08.2013 / 13:28
4

Uma abordagem - reconhecidamente pesada - é usar strace :

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

assistirá ao processo com PID 12345, interceptando nenhuma chamada de sistema (primeiro -e ) e nenhum sinal (segundo -e ). Depois que o processo sair de maneira regular, o valor de saída será impresso.

Se o processo for finalizado por um sinal, o strace sai silenciosamente (quando executado com as opções fornecidas acima). Você pode usar, por exemplo, -e signal=kill para alterar esse comportamento. Note, no entanto, que -e signal=all (ou, equivalentemente, omitindo a opção -e signal ) pode produzir uma grande quantidade de saída se os sinais forem recebidos e manipulados pelo programa.

    
por 15.08.2013 / 15:04
3
  1. Encadeando a execução de "notificar"

    $ process; notify $? &
    

    Observe que, se o processo sair de forma inesperada, notify não será executado

  2. Configurando armadilhas

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

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

Você não está claro em qual notificação está em mente. Em essência, pode ser qualquer coisa que soe um "sino", é claro. Um para muitos, por exemplo. notify-send da biblioteca libnotify .

$ process; notify-send "process finished with status $?" &
    
por 15.08.2013 / 14:46
2

se o seu processo for executado como deamon, considere o uso de upstart ou monit, eles são um pouco padronizados:

link

link

Eles podem monitorar processo, código de saída, reiniciar processos, gravar log, ...

    
por 15.08.2013 / 15:04
0

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é que o saída do processo, em seguida, com PTRACE_GETEVENTMSG , obtenha o status de saída.

Aqui uma amostra de implementação chamada stopper , eu verifiquei com o% Apenas a opçãoattach e algumas mudanças foram necessárias para que funcionasse (eventualmente, se necessário, postarei o código em algum lugar).

    
por 16.08.2013 / 04:05