Alerta cuando finaliza el proceso de ejecución

21

Aquí hay algunas preguntas y respuestas con respecto a ser alertado cuando un proceso se completa / sale ( 1 , 2 ), pero todos asumen que el usuario ha emitido dicho proceso y, por lo tanto, puede escribirlo con una alerta incorporada en el guión de gobierno, o canalizar el proceso a algún tipo de alerta.

Mi situación es que me gustaría recibir una alerta sobre la finalización / salida de un proceso que mi usuario no está inicializando. A saber, estoy procesando masivamente archivos de video masivos en un servidor Ubuntu 12.04 LTS. Ciertas operaciones en estos archivos llevan mucho tiempo, por lo que me gustaría algún tipo de alerta (el correo electrónico sería genial) cuando finalice uno específico. Tardan tanto, que hacer esto de forma puntual, manualmente, en base a PIT estaría perfectamente bien.

Para proporcionar más información, digamos que estoy procesando un archivo particularmente grande, y veo que ha progresado a un script FFMPEG, el proceso en sí mismo es un script de Python (que es bastante complejo y no está escrito por mí mismo, y algo No deseo modificar, aunque ese sería el primer enfoque lógico). Me imagino emitiendo un comando o script con el PID de dicho script python en ejecución como argumento, y cuando el proceso con ese PID ya no se ejecuta, el script de alerta hace lo suyo.

¿Algunas ideas?

dongle
fuente
monit ( mmonit.com/monit/documentation ) parece una opción potencial, pero mucho más compleja de lo que necesito, esperando que haya una forma más simple, más directa y menos hinchada de hacer solo lo que estoy pidiendo, y no más .
dongle

Respuestas:

9

Escribí process_watcher.py

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

Actualmente, el cuerpo del correo electrónico se ve así:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Comenzó: jue, mar 10 18:33:37 Terminó: jue, mar 10 18:34:26 (duración 0 : 00: 49)
Memoria (actual / 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

Escribe un problema de GitHub si necesitas alguna mejora.

Arlo
fuente
23

¿Algo como esto?

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

Reemplace $pidcon la identificación del proceso y echo "finished"con lo que quiera hacer cuando finalice el proceso.

Por ejemplo:

(while kill -0 $pid; do sleep 1; done) && mail ...
caos
fuente
¡Fenomenal! Funciona de maravilla.
dongle
1
Nota menor (y probablemente obvia): cuando dicho proceso no es propiedad del usuario, debe anular la eliminación.
dongle
1
@ dongle, al menos en mi casilla RHEL, kill -0informa No such processsobre pids inexistentes y Operation not permittedpara pids propiedad de un usuario diferente, por lo que quizás interpretar el mensaje de error debería obviar la necesidad desudo
iruvar
1
Si está haciendo eco, siempre podría hacerlo echo -en "\007 \007 \007", lo que emitirá una 'campana' terminal. Si eso se traduce en un sonido audible real depende de su terminal y hardware (pero generalmente lo hace).
Morgon
5

Solía &&ejecutar un segundo comando cuando el primero se completa con éxito. Aquí algunos ejemplos:

  1. Eliminar una carpeta grande y un pitido:

    rm -rv ~/tmp && beep
  2. Compile un núcleo y envíe un correo electrónico:

    make && mail -s "Compilation is done" user@yourmaildomain.com

¿Es esta una buena manera de resolver su problema? En otro caso, puede agregar un ||y un tercer comando en caso de falla.

Además, un script de shell podría recibir el estado de salida ( $?) de su comando, y con if/elsey bucles puede hacer lo que quiera.

Willian Paixao
fuente
Gracias Willian, pero como dije, el desafío particular en mi caso de uso es que este no es un comando que estoy emitiendo, sino un proceso que ya se está ejecutando. Por lo tanto, && no es una opción. Gracias de cualquier manera.
dongle
4

Si no tiene el pid, esto se ejecutará hasta que todas las instancias de ffmpeg hayan terminado:

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

Si no desea utilizar una opción de sondeo o un script externo, y ya ha comenzado el proceso de ejecución prolongada, puede suspenderlo con CTRL + Z (envía la señal SIGTSTP) y luego reanudarlo con fg(mueve el proceso a el primer plano).

Por ejemplo:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'
Benjamín
fuente
Excepto ... "Mi situación es que me gustaría recibir una alerta sobre la finalización / salida de un proceso que mi usuario no está inicializando".
Jeff Schaller
-1

Hice una aplicación que enviará una notificación a su teléfono Android cuando finalice un proceso para que no tenga que estar atado a su computadora.

Instale, luego agregue ;notifier.shal final de su comando.

Por ejemplo, si su comando fuera make install, haría su comando:

make install; notifier.sh

https://notifier.sh

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

Jolt151
fuente
"... pero todos estos suponen que el usuario ha emitido dicho proceso por sí mismos y, por lo tanto, puede escribirlo con una alerta integrada en el script de gobierno, o canalizar el proceso a algún tipo de alerta. / Mi situación es que me gustaría que me avisen de la finalización / salida de un proceso que mi usuario no está inicializando. ”
G-Man dice 'Reinstate Monica' el