Alerta ao finalizar o processo

18

Existem algumas perguntas e respostas aqui sobre o alerta quando um processo é concluído / sai ( 1 , 2 ) - mas todos estes assumem que o usuário emitiu o dito processo, e assim pode roteirizá-lo com um alerta embutido no script governante, ou canalizar o processo para algum tipo de alerta.

Minha situação é que eu gostaria de ser alertado sobre a conclusão / saída de um processo que meu usuário não está inicializando. Ou seja, estou a granel de processamento de arquivos de vídeo em massa em um servidor Ubuntu 12.04 LTS. Certas operações nesses arquivos demoram muito tempo, então eu gostaria de algum tipo de alerta (e-mail seria ótimo) quando um específico terminar. Eles demoram tanto, que fazer isso de uma só vez, manualmente, com base no PIT seria perfeitamente bem.

Para fornecer mais informações - digamos que estou processando um arquivo particularmente grande, e vejo que ele progrediu para um script FFMPEG, sendo o próprio processo um script python (que é bastante complexo e não é escrito por mim mesmo e algo que eu não desejo modificar - embora essa seja a primeira abordagem lógica). Eu imagino emitir um comando ou script com o PID do dito script python em execução como um argumento, e quando o processo com esse PID não estiver mais sendo executado, o script de alerta faz o seu trabalho.

Alguma idéia?

    
por dongle 03.09.2014 / 15:59

4 respostas

6

Eu escrevi process_watcher.py

process_watcher --pid 1234 --to [email protected]

Atualmente, o corpo do e-mail parece com:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe=5
Started: Thu, Mar 10 18:33:37 Ended: Thu, Mar 10 18:34:26 (duration 0:00:49)
Memory (current/peak) - Resident: 155,280 / 155,304 kB Virtual: 1,166,968 / 1,188,216 kB

[+] indicates the argument may be specified multiple times, for example:
 process-watcher -p 1234 -p 4258 -c myapp -c "exec\d+" --to [email protected] --to [email protected]

optional arguments:
  -h, --help            show this help message and exit
  -p PID, --pid PID     process ID(s) to watch [+]
  -c COMMAND_PATTERN, --command COMMAND_PATTERN
                        watch all processes matching the command name. (RegEx pattern) [+]
  -w, --watch-new       watch for new processes that match --command. (run forever)
  --to EMAIL_ADDRESS    email address to send to [+]
  -n, --notify          send DBUS Desktop notification
  -i SECONDS, --interval SECONDS
                        how often to check on processes. (default: 15.0 seconds)
  -q, --quiet           don't print anything to stdout

Cite um problema no GitHub se precisar de melhorias.

    
por 11.03.2016 / 05:14
16

Algo parecido com isto?

(while kill -0 $pid; do sleep 1; done) && echo "finished"

Substitua $pid pelo ID do processo e echo "finished" pelo que você quiser fazer quando o processo terminar.

Por exemplo:

(while kill -0 $pid; do sleep 1; done) && mail ...
    
por 03.09.2014 / 16:09
5

Eu uso && para executar um segundo comando quando o primeiro é concluído com sucesso. Aqui alguns exemplos:

  1. Exclua uma pasta grande e bipe:

    rm -rv ~/tmp && beep
    
  2. Compile um kernel e envie um email:

    make && mail -s "Compilation is done" [email protected]
    

Esta é uma boa maneira de resolver seu problema? Em outro caso, você pode adicionar um || e um terceiro comando em caso de falha.

Além disso, um script de shell pode receber o status de saída ( $? ) do seu comando, e com if/else e loops você pode fazer o que quiser.

    
por 03.09.2014 / 16:07
4

Se você não tiver o pid, isso será executado até que todas as instâncias do ffmpeg tenham terminado:

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"
    
por 03.09.2014 / 19:26