Gibt es ein Programm, das mir eine Benachrichtigungs-E-Mail senden kann, wenn ein Vorgang abgeschlossen ist?

46

Ich bin ein Informatiker und führe unter Linux viele langwierige Berechnungen durch. Insbesondere führe ich Molekulardynamik (MD) -Simulationen mit dem GROMACS-Paket durch. Diese Simulationen können Tage oder Wochen dauern und beispielsweise 8 bis 24 Kerne umfassen. Ich habe Zugriff auf mehrere Knoten eines Clusters. Dies bedeutet, dass zu einem bestimmten Zeitpunkt ungefähr 4 oder 5 Jobs ausgeführt werden (jeder auf einem anderen Knoten und jeder auf 8 bis 24 Kernen).

Das Problem ist, dass die Simulation eine variable Zeitdauer benötigt. Ich mag es, wenn alle Knoten rund um die Uhr an Simulationen arbeiten, aber um eine neue Simulation zu starten, muss ich mich mit einem Terminal anmelden und einige manuelle Arbeiten ausführen. Aber ich vergesse immer, wie viel Zeit in einer Simulation verbleibt, und überprüfe sie ständig.

Kann ich eine E-Mail erhalten, wenn ein Linux-Prozess abgeschlossen ist? Könnte es ein Linux-Programm geben, das dies tut? Auf diese Weise würde ich wissen, wann ich mich mit einem Terminal anmelden und die nächste Simulation vorbereiten muss.

Ich benutze Ubuntu Linux. Vielen Dank für Ihre Zeit.

Andrew
quelle
3
Das war eine ziemlich lange und irrelevante Beschreibung für eine einfache Frage, die bereits im Titel behandelt wurde. Machst du das immer?
Acumenus
5
@ABB Als Wissenschaftler sehe ich in der "langen und irrelevanten" Beschreibung nützliche Informationen. Zum Beispiel wissen wir, dass manuelle Terminalarbeit erforderlich ist und daher gibt es einen Grund, die Frage zu stellen. Außerdem haben wir eine Vorstellung davon, was das OP tut, damit wir nicht völlig im Dunkeln denken und daher möglicherweise zusätzliche Informationen bereitstellen können, die in der Frage nicht angefordert werden, aber möglicherweise von Nutzen oder Interesse sind.
user3728501

Antworten:

30

Aufträge, die an den atDaemon gesendet werden, senden nach Abschluss alle Ausgaben von stderr und stdout an Sie. Es kann auch so konfiguriert werden, dass E-Mails gesendet werden, auch wenn der Auftrag keine Ausgabe enthält. Es hat auch den Vorteil, dass es nicht über ein steuerndes Terminal verfügt, sodass Sie sich keine Gedanken darüber machen müssen, wie sich das Schließen Ihres Terminals auf den Job auswirkt.

Beispiel:

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

Wenn dieser Auftrag abgeschlossen ist, erhält der Benutzer, der den Auftrag gesendet hat, eine E-Mail. Wenn überhaupt eine Ausgabe vorliegt, erhalten Sie diese. Sie können den E-Mail-Empfänger ändern, indem Sie die LOGNAMEUmgebungsvariable ändern .

atverfügt über einen Stapelverarbeitungsmodus, in dem Sie Jobs in die Warteschlange stellen können, die ausgeführt werden sollen, wenn das System nicht ausgelastet ist. Dies ist kein sehr gutes Warteschlangensystem, wenn mehrere Benutzer um Ressourcen konkurrieren, aber dennoch, wenn Sie Jobs damit ausführen möchten:

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

Standardmäßig werden die Jobs erst gestartet, wenn die Systemlast unter 1,5 liegt. Diese Last kann jedoch angepasst werden (und mit 24 Kernen sollten Sie das tun). Sie können parallel ausgeführt werden, wenn sie das Loadavg nicht über das Load-Limit (Standardeinstellung 1.5) hinaus erhöhen oder wenn sie das Loadavg einzeln über 1,5 erhöhen, werden sie seriell ausgeführt.

Sie können die Jobwarteschlange mit anzeigen atqund Jobs mit löschenatrm

Abhängigkeiten beantworten:

  1. Laufender atdDaemon ( ps -ef|grep atd)
  2. Sie dürfen Aufträge senden an atd(nicht verweigert von /etc/at.deny/ /etc/at.allowconfiguration)
  3. Funktionaler sendmailMTA

Die meisten Systeme haben keine Probleme mit diesen Anforderungen, aber es lohnt sich zu überprüfen.

Jodie C
quelle
49

Ja, das gibt es

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

Wo -s "Text" der Betreff ist, gibt das Echo Mail einen Text, der an Sie gesendet werden soll.

Bonsi Scott
quelle
4
Für den mailBefehl muss der lokale MTA ordnungsgemäß konfiguriert sein. Dies ist die einfache und einfache Lösung.
Jordanien
6
Sie können auch verwenden mail, um die Ausgabe des Befehls zu senden:{ command; echo Done; } | mail -s "subject" [email protected]
Glenn Jackman
4
@Andrew Beachten Sie, dass das Terminal / die Shell, in dem / der Sie den ursprünglichen Befehl ausgeführt haben, geöffnet bleiben muss, damit dies funktioniert. Dies mag nicht schwierig sein, wenn Sie so etwas wie screenoder verwenden tmux, aber es kann schwierig sein, ein Terminal für Tage / Wochen ohne dieses irgendwo offen zu haben. Die Lösung atfür das Job-Management würde sich auch um dieses Problem kümmern.
Caleb
@Caleb Fügen Sie &am Ende des Befehls nicht ein hinzu, damit der Befehl im Hintergrund ausgeführt wird. sleep 30 && echo "Process done" | mail -s "Process done" [email protected] &
Theo Kouzelis
@ Theo nein du kannst nicht. Selbst im Hintergrund ist der Prozess noch ein Kind Ihrer Shell, und wenn die Shell stirbt, erhält der untergeordnete Prozess ein Kill-Signal. Sie können die nohupVerknüpfung zu ihnen aufheben, verlieren jedoch auch die Möglichkeit, sie weiterhin über die Shell zu steuern. Dies ist teilweise, was tmuxist für. Es trennt die ausgeführten Prozesse von Ihrer aktiv verbundenen und angezeigten Terminalsitzung und lässt Sie trotzdem normal mit ihnen interagieren.
Caleb
7

Ich würde empfehlen, ein Python-Skript zum Senden einer E-Mail einzurichten. Sie sind sehr einfach zu schreiben und konfigurieren die richtigen Mailserver für jeden Dienst, den Sie verwenden. Sie sehen ungefähr so ​​aus:

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

Verwenden Sie dies in Verbindung mit dem in den anderen Antworten vorgeschlagenen Pipe-Operator.

Eine weitere großartige Lösung für dieses Problem ist die Verwendung von Pushover . Pushover - "Pushover erleichtert das Senden von Echtzeitbenachrichtigungen an Ihre Android- und iOS-Geräte." Ich habe ein einfaches Skript erstellt, mit dem die einfache API eine Nachricht an mein Telefon senden kann, wenn meine Builds abgeschlossen sind.

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
quelle
6

Sie können den trapBefehl auch zum Senden von E-Mails beim Beenden des Prozesses oder beim Unterbrechen, Auflegen oder Beenden des Prozesses verwenden. Hier ist der Code, den Sie oben in Ihrem Skript einfügen müssen.

    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

user1678213
quelle
5

Ich habe process_watcher.py geschrieben

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

Derzeit sieht der E-Mail-Text folgendermaßen aus:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Beginn: Do., 10. März 18:33:37 Ende: Do., 10. März 18:34:26 (Dauer 0 : 00: 49)
Speicher (aktuell / Spitzenwert) - Einwohner: 155.280 / 155.304 kB Virtuell: 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

Erstellen Sie ein GitHub-Problem, wenn Sie Verbesserungen benötigen.

Arlo
quelle
2
Gewinner für mich, weil sich per PID an einen bereits laufenden Prozess anhängen lässt.
Joseph_Morris
1
@joseph_morris Dieses Skript gefällt mir auch - aber der Vollständigkeit halber können Sie ohne diesen Helfer einfach eine Verbindung zu einem laufenden (angehaltenen, über Strg-Z) Prozess herstellen, indem Sie den Befehl absetzen fg ‹PID›; mail -s Completed [email protected] <<< 'Message here'.
Konrad Rudolph
1

Ich habe ein eigenes Skript , das für mich funktioniert. Verwendungszweck:

mail-after <your command>

Es wird eine E-Mail mit aussagekräftigen Informationen zum Betreff und der Ausgabe des Prozesses im Textkörper gesendet.

Installationsanweisungen finden Sie auf der Hauptseite des GitHub-Repos - derzeit wird für alle Skripte ein Symlink in erstellt ~/bin.

krlmlr
quelle
1

Angenommen, Ihr Programm läuft bereits, verwenden Sie bash + pgrep, um es anzusehen.

# 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
quelle
Ich habe etwas Ähnliches benutzt: while $ (pgrep myprog); schlafe 60; getan; echo "myprog is done" | mail -s "process done" [email protected]
11.
0

Vor langer Zeit habe ich diesen Alias ​​erstellt (in csh verwende ich ihn jetzt in tcsh):

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

Es erfordert, dass Mailes auf Ihrem System installiert ist und funktioniert, hat jedoch den Vorteil, dass Ihr Befehl genauso ausgeführt wird wie über die Befehlszeile (einschließlich Aliase, Tilde-Erweiterungen usw.) - wenn Sie einen Job mit atoder cronunter Standard ausführen Umgebung, die möglicherweise so unterschiedlich ist, dass Ihr Skript fehlschlägt oder ungewöhnliche Ausgaben liefert (das hat mich schon cronoft gebissen )

barrycarter
quelle