web-dev-qa-db-fra.com

Existe-t-il un programme qui peut m'envoyer un e-mail de notification à la fin d'un processus?

Je suis un scientifique en informatique et j'exécute beaucoup de longs calculs sur Linux. Plus précisément, je lance des simulations de dynamique moléculaire (MD) en utilisant le package GROMACS. Ces simulations peuvent prendre des jours ou des semaines, fonctionnant sur (par exemple) 8 à 24 cœurs. J'ai accès à plusieurs nœuds d'un cluster, ce qui signifie qu'à tout moment, j'exécute environ 4 ou 5 travaux (chacun sur un nœud différent et chacun sur 8-24 cœurs).

Le problème est que la simulation prend un temps variable. J'aime que tous les nœuds travaillent sur des simulations 24 heures sur 24, mais pour démarrer une nouvelle simulation, je dois me connecter avec un terminal et faire un travail manuel. Mais j'oublie toujours combien de temps il reste dans une simulation, donc je finis toujours par les vérifier constamment.

Existe-t-il un moyen de recevoir un e-mail lorsqu'un processus Linux se termine? Pourrait-il y avoir un programme Linux qui fait cela? De cette façon, je saurais quand me connecter avec un terminal et préparer la prochaine simulation.

J'utilise Ubuntu Linux. Merci pour votre temps.

47
Andrew

Les travaux soumis au démon at vous enverront toute sortie de stderr et stdout à la fin. Il peut également être configuré pour envoyer du courrier même si le travail n'a pas de sortie. Il a également l'avantage de fonctionner sans terminal de contrôle, vous n'avez donc pas à vous soucier de l'effet que la fermeture de votre terminal aura sur le travail.

exemple:

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

Une fois ce travail terminé, l'utilisateur qui a soumis le travail recevra un e-mail et s'il y a une sortie, vous le recevrez. Vous pouvez modifier le destinataire de l'e-mail en modifiant la variable d'environnement LOGNAME.

at dispose d'un mode batch où vous pouvez mettre en file d'attente des travaux à exécuter lorsque le système n'est pas occupé. Ce n'est pas un très bon système de mise en file d'attente lorsque plusieurs utilisateurs sont en concurrence pour les ressources, mais néanmoins, si vous souhaitez exécuter des travaux avec:

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

Par défaut, les travaux ne démarrent que si la charge système est inférieure à 1,5, mais ce chiffre de charge peut être ajusté (et avec 24 cœurs, je dirais que vous devriez). Ils peuvent fonctionner en parallèle s'ils ne dépassent pas le loadavg au-dessus de la limite de charge (1.5 par défaut à nouveau), ou s'ils dépassent individuellement le loadavg au-dessus de 1.5, ils s'exécuteront en série.

Vous pouvez afficher la file d'attente des travaux avec atq et supprimer des travaux avec atrm

Dépendances de réponse:

  1. Exécution du démon atd (ps -ef|grep atd)
  2. Vous êtes autorisé à soumettre des travaux à atd (non refusé par /etc/at.deny//etc/at.allow configurations)
  3. Fonctionnel sendmail MTA

La plupart des systèmes n'ont aucun problème avec ces exigences, mais cela vaut la peine de vérifier.

31
Jodie C

Ouais, il y a

command; echo "Process done" | mail -s "Process done" [email protected]

Où -s "texte" est le sujet, l'écho donne au courrier du texte à vous envoyer.

50
Bonsi Scott

Je recommanderais de définir un script python pour envoyer un e-mail, ils sont très faciles à écrire et à configurer les bons serveurs de messagerie pour le service que vous utilisez. Ils ressemblent à ceci:

#!/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"

Utilisez-le en conjonction avec l'opérateur de tuyau suggéré dans les autres réponses.

Une autre excellente solution que j'ai trouvée à ce problème utilise Pushover . Pushover - "Pushover, il est facile d'envoyer des notifications en temps réel à vos Android et iOS." J'ai configuré un script simple qui a finalisé l'API facile pour envoyer un message à mon téléphone lorsque mes builds sont fait.

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

Vous pouvez également utiliser la commande trap pour envoyer du courrier à la sortie du processus, ou à l'interruption, le raccrochage ou à la fin du processus. Voici le code que vous devez placer en haut de votre script.

    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

6
user1678213

J'ai écrit process_watcher.py

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

Actuellement, le corps de l'e-mail ressemble à ceci:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Début: jeu 10 mars 18:33:37 Fin: jeu 10 mars 18:34:26 (durée 0:00:49)
Mémoire (courant/crête) - Résident: 155 280/155 304 kB Virtuel: 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

Créez un problème GitHub si vous avez besoin d'améliorations.

5
Arlo

J'ai un script maison qui fonctionne pour moi. Usage:

mail-after <your command>

Il enverra un e-mail avec des informations significatives sur le sujet et avec la sortie du processus dans le corps.

Les instructions d'installation sont sur la page principale du dépôt GitHub - actuellement pour tous les scripts, un lien symbolique est créé dans ~/bin.

2
krlmlr

En supposant que votre programme est déjà en cours d'exécution, utilisez bash + pgrep pour le regarder.

# Check that "pgrep $PROGRAM" returns the rid PID.
PROGRAM=foo
[email protected]
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;
1
Matt Callaway

Il y a un certain temps, j'ai créé cet alias (en csh, je l'utilise maintenant en tcsh):

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

Il nécessite que Mail soit installé et fonctionne sur votre système, mais présente l'avantage que votre commande s'exécute exactement comme elle le ferait à partir de la ligne de commande (y compris les alias, les extensions tilde, etc.) - lorsque vous exécutez un travail à l'aide de at ou cron il s'exécute dans un environnement par défaut qui peut être suffisamment différent pour entraîner l'échec de votre script ou fournir une sortie inhabituelle (j'en ai été mordu par cron many fois)

0
barrycarter