Existe-t-il un programme pouvant m'envoyer un e-mail de notification lorsqu'un processus est terminé?

46

Je suis un scientifique en informatique et je fais beaucoup de calculs longs sous Linux. Plus précisément, j'effectue des simulations de dynamique moléculaire (MD) à l'aide du progiciel GROMACS. Ces simulations peuvent prendre des jours, voire des semaines, 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 tâches (chacune sur un nœud différent et 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 effectuer un travail manuel. Mais j'oublie toujours combien de temps il reste dans une simulation, je finis donc toujours par les vérifier constamment.

Est-il possible de recevoir un courrier électronique à la fin d'un processus Linux? Pourrait-il y avoir un programme Linux qui fait cela? De cette façon, je saurais quand ouvrir une session avec un terminal et préparer la prochaine simulation.

J'utilise Ubuntu Linux. Merci pour votre temps.

Andrew
la source
3
C’était une description assez longue et peu pertinente d’une question simple qui figurait déjà dans le titre. Tu fais toujours ça?
Acumenus
5
@ABB En tant que scientifique, j’estime qu’il existe des informations utiles dans la description "longue et non pertinente". Par exemple, nous savons que le travail manuel au terminal est nécessaire et qu’il existe donc un motif pour poser la question. De plus, nous avons une idée de ce que fait le PO, nous ne pensons donc pas totalement dans le noir et pouvons donc être en mesure de fournir des informations supplémentaires qui ne sont pas demandées dans la question, mais qui peuvent être utiles ou intéressantes.
user3728501

Réponses:

30

Les travaux soumis au atdémon 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 présente également l'avantage de fonctionner sans terminal de contrôle, vous évitant ainsi de vous inquiéter des effets de la fermeture de votre terminal sur votre travail.

exemple:

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

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

atdispose d'un mode de traitement par lots dans lequel vous pouvez mettre en file d'attente les 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 se font concurrence pour obtenir des ressources, mais néanmoins, si vous souhaitez exécuter des tâches avec ce dernier:

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 tâches ne démarreront que si la charge du système est inférieure à 1,5, mais cette charge peut être ajustée (et avec 24 cœurs, je dirais que vous devriez). Ils peuvent fonctionner en parallèle s’ils ne dépassent pas loadavg au-dessus de la limite de charge (1,5 fois la valeur par défaut), ou s’ils dépassent individuellement loadavg au-delà de 1,5, ils fonctionneront en série.

Vous pouvez afficher la file d’attente avec atqet supprimer des tâches avecatrm

Répondre aux dépendances:

  1. Lancer le atddémon ( ps -ef|grep atd)
  2. Vous êtes autorisé à soumettre des travaux à atd(non refusés par /etc/at.deny/ /etc/at.allowconfigurations)
  3. sendmailMTA fonctionnel

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

Jodie C
la source
49

Oui, il y a

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

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

Bonsi Scott
la source
4
La mailcommande nécessite que le MTA local soit configuré correctement. C'est la solution facile et simple.
Jordanie
6
vous pouvez également utiliser mailpour vous envoyer le résultat de la commande:{ command; echo Done; } | mail -s "subject" [email protected]
glenn jackman
4
@ Andrew Ne pas oublier que pour que cela fonctionne, le terminal / shell dans lequel vous avez exécuté la commande d'origine doit rester ouvert. Cela peut ne pas être difficile si vous utilisez quelque chose comme screenou tmux, mais il peut être délicat de laisser un terminal ouvert quelque part sans jours. La solution atpour la gestion des tâches s’occuperait également de ce problème.
Caleb
@Caleb Cant vous ajoutez un &à la fin de la commande pour qu'elle s'exécute dans l'arrière-plan. sleep 30 && echo "Process done" | mail -s "Process done" [email protected] &
Theo Kouzelis
@Theo non, vous ne pouvez pas. Même en arrière-plan, le processus reste un enfant de votre shell et si celui-ci meurt, le processus enfant recevra un signal de suppression. Vous pouvez utiliser nohuppour les dissocier, mais vous perdez également la possibilité de continuer à le contrôler depuis le shell. C'est en partie à quoi ça tmuxsert. Il sépare les processus en cours de votre session de terminal activement connectée et visualisée tout en vous permettant d'interagir normalement avec eux.
Caleb
7

Je recommanderais de définir un script python pour envoyer un courrier électronique. Il est très facile d'écrire et de configurer les serveurs de messagerie appropriés 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 ceci conjointement avec l’opérateur de pipe suggéré dans les autres réponses.

Une autre excellente solution que j'ai trouvée à ce problème consiste à utiliser Pushover . Pushover - "Pushover facilite l'envoi de notifications en temps réel à vos appareils Android et iOS." J'ai mis en place un script simple qui permettait à l'API facile d'envoyer un message à mon téléphone une fois la construction terminée.

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
la source
6

Vous pouvez également utiliser la trapcommande pour envoyer un courrier à la sortie du processus, ou lors de l'interruption, du raccrochement ou de 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

utilisateur1678213
la source
5

J'ai écrit process_watcher.py

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

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

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Commencé: jeu., 10 mars 18:33:37 Terminé: jeu., 10 mars 18:34:26 (durée 0 : 00: 49)
Mémoire (courant / maximum) - 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 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

Créez un problème avec GitHub si vous avez besoin d’être amélioré.

Arlo
la source
2
Gagnant pour moi car peut attacher par PID à un processus déjà en cours d'exécution.
joseph_morris
1
@ joseph_morris J'aime aussi ce script - mais pour être complet, vous pouvez facilement attacher à un processus en cours d'exécution (suspendu, via Ctrl-Z) sans cet assistant en émettant la commande fg ‹PID›; mail -s Completed [email protected] <<< 'Message here'.
Konrad Rudolph
1

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

mail-after <your command>

Il enverra un courrier électronique avec des informations significatives sur le sujet et sur la sortie du processus dans le corps.

Les instructions d’installation se trouvent sur la page principale du référentiel GitHub - actuellement, un lien symbolique est créé pour tous les scripts ~/bin.

krlmlr
la source
1

En supposant que votre programme est déjà lancé, utilisez bash + pgrep pour le regarder.

# 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
la source
J'ai utilisé quelque chose de similaire: while [[$ (pgrep myprog)]]; je dors 60; terminé; echo "myprog is done" | mail « processus fait » de [email protected]
Marlar
0

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

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

Il exige que Mailsoit installé et fonctionne sur votre système, mais a l'avantage que votre commande fonctionne exactement comme il de la ligne de commande (y compris les alias, tilde extensions, etc) - lorsque vous exécutez un travail en utilisant atou cronil fonctionne sous un défaut environnement qui peut être suffisamment différent pour que votre script échoue ou produise un résultat inhabituel (cela mord cronsouvent à cela)

barrycarter
la source