Alerta ao concluir o processo em execução

21

Existem algumas perguntas e respostas aqui em relação ao alerta quando um processo é concluído / sai ( 1 , 2 ) - mas tudo isso pressupõe que o usuário tenha emitido o processo por conta própria e, portanto, pode criá-lo com um alerta incorporado no script de governo ou canalize 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 processando em massa grandes arquivos de vídeo em um servidor Ubuntu 12.04 LTS. Certas operações nesses arquivos levam muito tempo, então eu gostaria de algum tipo de alerta (o e-mail seria ótimo) quando uma operação específica terminar. Eles demoram tanto tempo que fazer isso de forma única, manualmente, com base no PIT seria perfeitamente adequado.

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

Alguma ideia?

dongle
fonte
O monit ( mmonit.com/monit/documentation ) parece ser uma opção em potencial, mas muito mais complexa do que eu preciso - esperando que exista uma maneira mais simples, direta e menos inchada de fazer apenas o que estou pedindo e não mais .
dongle

Respostas:

9

Eu escrevi process_watcher.py

process_watcher --pid 1234 --to me@gmail.com

Atualmente, o corpo do email se parece com:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Iniciado: quinta-feira, 10 de março 18:33:37 Finalizado: quinta-feira, 10 de março 18:34:26 (duração 0 : 00: 49)
Memória (atual / pico) - Residente: 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 person1@domain.com --to person2@someplace.com

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

Crie um problema no GitHub se precisar de melhorias.

Arlo
fonte
23

Algo assim?

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

Substitua $pidpela identificação do processo e echo "finished"pelo que você deseja fazer quando o processo for encerrado.

Por exemplo:

(while kill -0 $pid; do sleep 1; done) && mail ...
caos
fonte
Fenomenal! Funciona como um encanto.
dongle
1
Nota menor (e provavelmente óbvia) - quando esse processo não é de propriedade do usuário, deve-se sudo a morte.
dongle
1
@dongle, pelo menos na minha caixa RHEL, kill -0relatórios No such processpara pids inexistentes e Operation not permittedpara pids propriedade de um usuário diferente, então talvez interpretando a mensagem de erro deve evitar a necessidade desudo
Iruvar
1
Se você estiver ecoando, poderá sempre echo -en "\007 \007 \007", o que emitirá um 'sino' terminal. Se isso se traduz em um som audível real depende do seu terminal e hardware (mas normalmente depende).
Morgon
5

Eu uso &&para executar um segundo comando quando o primeiro é concluído com êxito. Aqui estão 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" user@yourmaildomain.com

Essa é 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/elsee loops você pode fazer o que quiser.

Willian Paixao
fonte
Obrigado Willian, mas como eu disse, o desafio específico no meu caso de uso é que este não é um comando que estou emitindo, mas um processo já em execução. Portanto, o&& não é uma opção. Obrigado mesmo assim.
dongle
4

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

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"
user82927
fonte
0

Se você não quiser usar uma opção de pesquisa ou um script externo e já tiver iniciado o processo de longa execução, poderá suspendê-lo com CTRL + Z (envia sinal SIGTSTP) e, em seguida, retome-o com fg(move o processo para primeiro plano).

Por exemplo:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'
Benjamin
fonte
Exceto ... "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."
Jeff Schaller
-1

Eu criei um aplicativo que enviará uma notificação para o seu telefone Android quando um processo terminar, para que você não precise estar conectado ao seu computador.

Instale e adicione ;notifier.shao final do seu comando.

Por exemplo, se o seu comando fosse make install, você faria o seu comando:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier

Jolt151
fonte
“… Mas todos assumem que o usuário emitiu o processo por conta própria e, portanto, podem criá-lo com um alerta embutido no script de governo 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. ”
G-Man diz 'Reinstate Monica'