Wie erhalte ich E-Mails von (fehlgeschlagenen) Cron-Jobs in Ubuntu?

45

Ich erstelle Cron-Jobs in Ubuntu, indem ich die ausführbare Datei in eine von platziere /etc/cron.{daily,hourly,monthly,weekly}. Es gibt viele Verzeichnisse, die mit cron beginnen:

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

Ich möchte eine E-Mail von meinen Skripten erhalten, wenn:

  1. Ein Skript schlägt fehl und gibt einen Exit-Code ungleich Null aus.
  2. Das Drehbuch hat mir etwas zu sagen

Ich habe SSMTP installiert und arbeite, ich sende meine E-Mails von meinem Google-Konto. Die Tatsache, dass SSMTP nur E-Mails mit einem Konto senden kann, ist für mich kein Problem. Es ist nur ein Heimserver und die Benutzer, die ich habe, können keine Cronjobs hinzufügen.

Ich würde gerne wissen, wie das Mailing von Skripten normalerweise unter Linux / Unix im Allgemeinen und unter Ubuntu im Besonderen funktioniert. Ich würde auch gerne wissen, wie ich in den beiden obigen Situationen E-Mails erhalten kann.

Gelöscht
quelle

Antworten:

60

Standardmäßig sendet cron eine E-Mail an den Eigentümer des Kontos, unter dem die crontab ausgeführt wird.

Die systemweite crontab befindet sich in / etc / crontab unter dem Benutzer `root '

Da root häufig verwendet wird, würde ich empfehlen, Ihrer Datei / etc / aliases trotzdem einen Root-Alias ​​hinzuzufügen. ('newaliases' nachher ausführen)

Die normale Art, dies zu strukturieren, besteht darin, dass root auf einen anderen Benutzer im System ausgerichtet wird, z. B. würde ich für mich den Alias ​​"root" auf "phil" (mein Benutzerkonto) und den Alias ​​"phil" auf meine externe E-Mail-Adresse setzen.

Wenn Sie über einen bestimmten Benutzer-Cron verfügen, den Sie bei der Ausgabe per E-Mail erhalten möchten, können Sie / etc / aliases erneut verwenden (sofern Sie über Superuser-Zugriff verfügen), um den Benutzer an eine andere E-Mail-Adresse umzuleiten oben auf Ihrer Crontab:

MAILTO="[email protected]"

Wenn E-Mails an einen lokalen Benutzer gesendet werden sollen, können Sie stattdessen nur den Benutzernamen eingeben:

MAILTO=someuser

Wenn Sie weitere Informationen benötigen, lesen Sie crontab (5), indem Sie Folgendes ausführen:

man 5 crontab
Philip Reynolds
quelle
Sollen /etc/aliasesEinträge nicht dem Format folgen name: value1, value2, ...? Ich weiß nicht, vielleicht wurde das Format in den letzten 8 Jahren irgendwann geändert.
Nathan Jones
1
"Für mich würde ich den Alias" root "für" phil "(mein Benutzerkonto) und den Alias" phil "für meine externe E-Mail-Adresse verwenden." Wie kann ich "phil" an eine externe E-Mail-Adresse senden?
Howard Lee
29

Um E-Mails von vixie cron zu erhalten, benötigen Sie etwas, das den Befehl sendmail repliziert. Wenn Sie also Postfix oder SSMTP installieren, wird dieser Teil behoben. Wenn Sie Postfix verwenden, kann die Aliase-Datei verwendet werden, um Systembenutzer echten E-Mail-Adressen zuzuordnen.

Wenn Sie MAILTO = "[email protected]" oben auf einer crontab hinzufügen, wird die Ausgabe des Cron-Jobs per E-Mail gesendet. Dies ist unabhängig vom Fehlercode.

Bei Skripten, die Fehler korrekt in STDERR ausgeben, ist es einfach, nur dann eine E-Mail zu erhalten, wenn sie schief gehen.

MAILTO="[email protected]"
0 5 * * * /bin/some_script > /dev/null

Dadurch wird nur das STDOUT auf null umgeleitet. Wenn STDERR-Nachrichten vorhanden sind, erhalten Sie eine E-Mail.

Ich habe jedoch festgestellt, dass einige Skripte Fehler fälschlicherweise als STDOUT ausgeben und den Exit-Code auf 1 setzen. Ich habe keine Möglichkeit gefunden, die Ausgabe von diesen zu erfassen, aber ignoriere die Ausgabe, wenn der Exit-Code 0 ist. Die einzige Methode Ich kann mir vorstellen, die Ausgabe in eine Datei umzuleiten. Wenn der Exit-Code nicht 0 ist, wird diese Datei ausgegeben, damit cron sie abruft. Scheint aber ziemlich schrecklich.

Theozaurus
quelle
3
Könnte versuchen, habilis.net/cronic
dfrankow
8

Wenn Sie alle Ausgaben (stdout und stderr) an eine bestimmte Adresse senden möchten, können Sie die MAILTOVariable verwenden. Platzieren Sie beispielsweise Folgendes oben im Skript.

MAILTO="[email protected]"
Dan Carley
quelle
5

Versuchen Sie, "root: [email protected]" zu / etc / aliases hinzuzufügen

Dadurch werden alle Nachrichten für diesen Benutzer an Ihre E-Mail gesendet. Wenn Sie nicht alle Nachrichten möchten, können Sie einen Benutzer speziell dafür erstellen.

Solange das Skript etwas ausgibt, erhalten Sie eine Mail.

Daniel P
quelle
3

Auf all meinen Produktionsservern, auf denen normalerweise täglich etwa 20 Cronjobs laufen, schwöre ich auf das Paket python-cronwrap. Überprüfen Sie es hier: http://pypi.python.org/pypi/cronwrap . Es ist sehr einfach zu konfigurieren und vor allem zuverlässig.

Low Kian Seong
quelle
2

Ich glaube nicht, dass SSMTP Ihren Anforderungen entspricht. Sie benötigen etwas, das E-Mails von den Cron-Prozessen "empfangen" und dann an Ihre reale Mailbox senden kann.

Ich verwende Sendmail, aber das liegt daran, dass ich eine alte Sun-Hand bin. Ich weiß, dass es heutzutage von all den coolen Kids, die Postfix verwenden, ausgelacht wird. Ihre Ubuntu-Community kann Sie beim Einrichten Ihres Mail-Systems unterstützen.

David Mackintosh
quelle
ssmtp implementiert / bin / sendmail
bobpaul
2

Eine Alternative - Ich archiviere die gesamte Root-Mail in einigen Dateien und lösche dann die ursprüngliche Mail.

Ich habe ein Skript geschrieben (hier ist der Schlüsselteil) -

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

Das hält alles aufgeräumt und ich kann es im Auge behalten. Ich könnte eine tägliche Mail-Datei per E-Mail an eine externe E-Mail-ID usw. senden.

irdroid3
quelle