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.
Antworten:
Aufträge, die an den
at
Daemon 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:
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
LOGNAME
Umgebungsvariable ändern .at
verfü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: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
atq
und Jobs mit löschenatrm
Abhängigkeiten beantworten:
atd
Daemon (ps -ef|grep atd
)atd
(nicht verweigert von/etc/at.deny
//etc/at.allow
configuration)sendmail
MTADie meisten Systeme haben keine Probleme mit diesen Anforderungen, aber es lohnt sich zu überprüfen.
quelle
Ja, das gibt es
Wo -s "Text" der Betreff ist, gibt das Echo Mail einen Text, der an Sie gesendet werden soll.
quelle
mail
Befehl muss der lokale MTA ordnungsgemäß konfiguriert sein. Dies ist die einfache und einfache Lösung.mail
, um die Ausgabe des Befehls zu senden:{ command; echo Done; } | mail -s "subject" [email protected]
screen
oder verwendentmux
, aber es kann schwierig sein, ein Terminal für Tage / Wochen ohne dieses irgendwo offen zu haben. Die Lösungat
für das Job-Management würde sich auch um dieses Problem kümmern.&
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] &
nohup
Verknüpfung zu ihnen aufheben, verlieren jedoch auch die Möglichkeit, sie weiterhin über die Shell zu steuern. Dies ist teilweise, wastmux
ist für. Es trennt die ausgeführten Prozesse von Ihrer aktiv verbundenen und angezeigten Terminalsitzung und lässt Sie trotzdem normal mit ihnen interagieren.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:
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.
quelle
Sie können den
trap
Befehl 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.Arun
quelle
Ich habe process_watcher.py geschrieben
Derzeit sieht der E-Mail-Text folgendermaßen aus:
Erstellen Sie ein GitHub-Problem, wenn Sie Verbesserungen benötigen.
quelle
fg ‹PID›; mail -s Completed [email protected] <<< 'Message here'
.Ich habe ein eigenes Skript , das für mich funktioniert. Verwendungszweck:
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
.quelle
Angenommen, Ihr Programm läuft bereits, verwenden Sie bash + pgrep, um es anzusehen.
quelle
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
Mail
es 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 mitat
odercron
unter Standard ausführen Umgebung, die möglicherweise so unterschiedlich ist, dass Ihr Skript fehlschlägt oder ungewöhnliche Ausgaben liefert (das hat mich schoncron
oft gebissen )quelle