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.

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@domain.com"

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

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 = "foo@bar.com" 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="foo@bar.com"
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.


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="address@example.com"

5

Versuchen Sie, "root: your@email.address" 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.


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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.