¿Hay algún programa que pueda enviarme un correo electrónico de notificación cuando finalice un proceso?

46

Soy un científico computacional y ejecuto muchos cálculos largos en Linux. Específicamente, ejecuto simulaciones de dinámica molecular (MD) usando el paquete GROMACS. Estas simulaciones pueden llevar días o semanas, ejecutándose (por ejemplo) de 8 a 24 núcleos. Tengo acceso a varios nodos de un clúster, lo que significa que en cualquier momento estoy ejecutando aproximadamente 4 o 5 trabajos (cada uno en un nodo diferente y cada uno en 8-24 núcleos).

El problema es que la simulación lleva una cantidad de tiempo variable. Me gusta mantener todos los nodos trabajando en simulaciones durante todo el día, pero para comenzar una nueva simulación, necesito iniciar sesión con un terminal y hacer un trabajo manual. Pero siempre olvido cuánto tiempo queda en una simulación, así que siempre termino constantemente revisándolos.

¿Hay alguna forma de recibir un correo electrónico cuando finaliza un proceso de Linux? ¿Podría haber un programa de Linux que haga esto? De esa manera sabría cuándo iniciar sesión con un terminal y preparar la próxima simulación.

Estoy usando Ubuntu Linux. Gracias por tu tiempo.

Andrés
fuente
3
Esa fue una descripción bastante larga e irrelevante para una pregunta simple que ya estaba cubierta en el título. ¿Siempre haces esto?
Acumenus
55
@ABB Como científico, considero que hay información útil en la descripción "larga e irrelevante". Por ejemplo, sabemos que se requiere el trabajo manual del terminal y, por lo tanto, hay una razón para hacer la pregunta. Además, tenemos una idea de lo que está haciendo el OP, por lo que no estamos pensando totalmente en la oscuridad y, por lo tanto, podemos proporcionar información adicional que no se solicita en la pregunta pero que puede ser útil o interesante.
user3728501

Respuestas:

30

Los trabajos enviados al atdemonio le enviarán cualquier salida de stderr y stdout al finalizar. También se puede configurar para enviar correo incluso si el trabajo no tiene salida. También tiene la ventaja de ejecutarse sin un terminal de control, por lo que no tiene que preocuparse por el efecto que tendrá el cierre de su terminal en el trabajo.

ejemplo:

echo "/opt/product/bin/job.sh data123"|at -m NOW

Cuando este trabajo se complete, el usuario que envió el trabajo recibirá un correo electrónico, y si hay algún resultado, lo recibirá. Puede cambiar el destinatario del correo electrónico cambiando la LOGNAMEvariable de entorno.

attiene un modo por lotes donde puede poner en cola trabajos para ejecutar cuando el sistema no está ocupado. Este no es un sistema de colas muy bueno cuando varios usuarios compiten por los recursos, pero no obstante, si desea ejecutar trabajos con él:

echo "/opt/product/bin/job.sh dataA"|batch
echo "/opt/product/bin/job.sh dataB"|batch
echo "/opt/product/bin/job.sh dataC"|batch

Por defecto, los trabajos no se iniciarán a menos que la carga del sistema sea inferior a 1.5, pero esa cifra de carga se puede ajustar (y con 24 núcleos, diría que debería). Pueden ejecutarse en paralelo si no aumentan la carga por encima del límite de carga (1,5 por defecto de nuevo), o si aumentan la carga individualmente por encima de 1,5, se ejecutarán en serie.

Puede ver la cola de trabajos con atqy eliminar trabajos conatrm

Responde dependencias:

  1. Ejecutando atddaemon ( ps -ef|grep atd)
  2. Puede enviar trabajos a atd(no denegado por /etc/at.deny/ /etc/at.allowconfiguraciones)
  3. sendmailMTA funcional

La mayoría de los sistemas no tienen problemas con estos requisitos, pero vale la pena verificarlos.

Jodie C
fuente
49

Si hay

command; echo "Process done" | mail -s "Process done" mail@domain.tld

Donde -s "texto" es el asunto, el eco le da al correo un texto para enviarle.

Bonsi Scott
fuente
44
El mailcomando requiere que el MTA local esté configurado correctamente. Esta es la solución fácil y simple.
jordanm
66
también puede usar mailpara enviarle la salida del comando:{ command; echo Done; } | mail -s "subject" [email protected]
glenn jackman
44
@ Andrew Tenga en cuenta que para que esto funcione el terminal / shell en el que ejecutó el comando original debe permanecer abierto. Esto podría no ser difícil si usa algo como screeno tmux, pero puede ser difícil tener un terminal abierto en algún lugar durante días / semanas sin él. La solución atpara la gestión del trabajo también se ocuparía de ese problema.
Caleb
@Caleb No puede agregar un &al final del comando para que se ejecute en segundo plano. sleep 30 && echo "Process done" | mail -s "Process done" [email protected] &
Theo Kouzelis
@Theo no, no puedes. Incluso en segundo plano, el proceso sigue siendo un elemento secundario de su shell y si el shell muere, el proceso secundario recibirá una señal de cierre. Usted podría utilizar nohuppara desvincular ellos, pero también perder la capacidad de seguir controlando desde el shell. Esto es parcialmente para lo que tmuxsirve. Divide los procesos en ejecución de su sesión de terminal conectada y vista activa mientras le permite interactuar con ellos normalmente.
Caleb
7

Recomiendo configurar un script de Python para enviar un correo electrónico, son muy fáciles de escribir y configuran los servidores de correo correctos para cualquier servicio que use. Se ven algo así:

#!/usr/bin/python

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Use esto junto con el operador de tubería sugerido en las otras respuestas.

Otra gran solución que he encontrado para este problema es usar Pushover . Pushover: "Pushover facilita el envío de notificaciones en tiempo real a sus dispositivos Android e iOS". Configuré un script simple que completó la API fácil para enviar un mensaje a mi teléfono cuando mis compilaciones están listas.

curl -s \
  -F "token=APP_TOKEN" \
  -F "user=USER_KEY" \
  -F "message=The build is done." \
  https://api.pushover.net/1/messages.json
Tom Cammann
fuente
6

También puede usar el trapcomando para enviar correo al salir del proceso, o al interrumpir, colgar o al finalizar el proceso. Aquí está el código que debe colocar en la parte superior de su secuencia de comandos.

    trap 'mail -s "Process done" [email protected]' exit # It will mail on normal exit
    trap 'mail -s "Process interrupted" [email protected]' INT HUP# it will mail on interrupt or hangup  of the process

Arun

usuario1678213
fuente
5

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
2
Ganador para mí porque puede adjuntarlo por PID a un proceso que ya se está ejecutando.
joseph_morris
1
@joseph_morris También me gusta esta secuencia de comandos, pero para completar, puede adjuntar fácilmente a un proceso en ejecución (suspendido, a través de Ctrl-Z) sin este ayudante emitiendo el comando fg ‹PID›; mail -s Completed [email protected] <<< 'Message here'.
Konrad Rudolph
1

Tengo un guión de cosecha propia que funciona para mí. Uso:

mail-after <your command>

Enviará un correo electrónico con información significativa sobre el tema y con la salida del proceso en el cuerpo.

Las instrucciones de instalación se encuentran en la página principal del repositorio de GitHub , actualmente para todos los scripts en los que se crea un enlace simbólico ~/bin.

krlmlr
fuente
1

Suponiendo que su programa ya se esté ejecutando, use bash + pgrep para verlo.

# Check that "pgrep $PROGRAM" returns the rid PID.
PROGRAM=foo
RECIPIENTS=you@yours.com
echo Watching $PROGRAM; while pgrep $PROGRAM &>/dev/null ; do sleep 1; echo -ne "."; done ; echo "$PROGRAM process done" | /bin/mail -s "$PROGRAM process done" $RECIPIENTS;
Matt Callaway
fuente
Usé algo similar: while [[$ (pgrep myprog)]]; duerme 60; hecho; echo "myprog está hecho" | mail -s "proceso hecho" [email protected]
marlar
0

Hace años, creé este alias (en csh, ahora lo uso en tcsh):

alias shunt "( \!* | Mail -s 'Output of: \!*' $user) >& /dev/null &"

Requiere que Mailesté instalado y funcionando en su sistema, pero tiene la ventaja de que su comando se ejecuta exactamente como lo haría desde la línea de comando (incluidos los alias, las expansiones de tilde, etc.) cuando ejecuta un trabajo usando ato cronse ejecuta de manera predeterminada entorno que puede ser lo suficientemente diferente como para que su script falle o proporcione resultados inusuales (eso me ha mordido cronmuchas veces)

barrycarter
fuente