Wie protokolliere ich Cron-Jobs?

218

Ich möchte wissen, wie ich genau sehen kann, was die Cron-Jobs bei jeder Ausführung tun. Wo befinden sich die Protokolldateien? Oder kann ich die Ausgabe an meine E-Mail senden? Ich habe die E-Mail-Adresse festgelegt, um das Protokoll zu senden, wenn der Cron-Job ausgeführt wird, aber ich habe noch nichts erhalten.

Adrian M.
quelle
Schauen Sie sich diesen Beitrag an: Verwalten von Protokolldateien, die von Cron-Jobs erstellt wurden .
Codeforester

Antworten:

347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

protokolliert alle Ausgaben des Cron-Jobs in /var/log/myjob.log

Sie können verwenden mail, um E-Mails zu senden. Die meisten Systeme senden nicht behandelte Jobausgaben cronper E-Mail an root oder den entsprechenden Benutzer.

Spliffster
quelle
78
Beschreibung dessen, was bedeutet 2>&1: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
Yamaneko
5
Was könnte das Problem sein, wenn diese Protokolldatei nie erstellt wird?
Klemme
10
FWIW, Wenn Sie beide stderrund stdoutim Protokoll wollen, 2>&1muss das nach der Indirektion kommen:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq
2
Wie füge YYYY-MM-DD_hh-mm-secich einen Namen in die Ausgabedatei ein, damit jeder Dateiname anders ist und ohne Umschreiben beibehalten wird?
Danijel
6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile
61

Standardmäßig protokolliert cron in / var / log / syslog, sodass Sie cronbezogene Einträge anzeigen können, indem Sie Folgendes verwenden:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log

Matthew Lock
quelle
2
Unter Ubuntu 12.04 ist die Standardeinstellung ohne .log, dh / var / log / syslog
tishma
5
Verwendung journalctl | grep cronauf systemd-Systemen
Microsoft Linux TM
2
/var/log/cronunter AWS Linux AMI.
Jonathan
2
odersudo journalctl -u cron
Gianfranco P.
2
Wo genau cronprotokolliert wird, ist sehr systemabhängig. Es gibt eine separate Antwort mit Details dazu, wie verschiedene Protokollierungsziele auf Linux-Systemen (oder genauer gesagt auf Systemen, die diese verwenden syslog) konfiguriert sind . Andere Systeme haben möglicherweise eine andere Möglichkeit, diese Dinge zu konfigurieren.
Tripleee
10

Hier ist mein Code:

* * * * * your_script_fullpath >> your_log_path 2>&1
Haimei
quelle
">>" bedeutet, Daten an fileright anhängen? Was bedeutet "2> & 1", volle Ausgabe mit Fehler, richtig?
Nullpointer
3
Grundlegende Umleitungsfragen werden am besten im Handbuch überprüft. Es gibt auch eine Metrik mit doppelten Fragen zu diesen Operatoren hier auf Stack Overflow. Aber ja, ungefähr; >>Hängt an und 2>&1sagt, dass der Standardfehler an dieselbe Stelle wie die Standardausgabe gesendet werden soll.
Tripleee
10

Es gibt mindestens drei verschiedene Arten der Protokollierung:

  1. Die Protokollierung VOR der Ausführung des Programms wird nur protokolliert, wenn der Cronjob versucht hat, den Befehl auszuführen. Dieser befindet sich in / var / log / syslog, wie bereits von @Matthew Lock erwähnt.

  2. Die Protokollierung von Fehlern NACH dem Versuch des Programms, ausgeführt zu werden, kann an eine E-Mail oder an eine Datei gesendet werden, wie von @Spliffster erwähnt. Ich bevorzuge die Protokollierung in einer Datei, da Sie mit E-Mail DANN eine NEUE Problemquelle haben und prüfen, ob das Senden und Empfangen von E-Mails einwandfrei funktioniert. Manchmal ist es das, manchmal nicht. In einem einfachen allgemeinen Desktop-Computer, auf dem Sie kein SMTP konfigurieren möchten, ziehen Sie es manchmal vor, sich in einer Datei anzumelden:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • Ich würde auch in Betracht ziehen, die Berechtigungen von / ABSOLUTE_PATH_TO_LOG zu überprüfen und den Befehl über die Berechtigungen dieses Benutzers auszuführen. Nur zur Überprüfung, während Sie testen, ob dies eine potenzielle Problemquelle sein könnte.
  3. Die Protokollierung des Programms selbst mit eigener Fehlerbehandlung und Protokollierung zu Nachverfolgungszwecken.

Es gibt einige häufige Ursachen für Probleme mit Cronjobs: * Der ABSOLUTE PFAD der auszuführenden Binärdatei. Wenn Sie es von Ihrer Shell aus ausführen, funktioniert es möglicherweise, aber der Cron-Prozess scheint eine andere Umgebung zu verwenden, und daher werden Binärdateien nicht immer gefunden, wenn Sie nicht den absoluten Pfad verwenden. * Die von einer Binärdatei verwendeten BIBLIOTHEKEN. Es ist mehr oder weniger der gleiche vorherige Punkt, aber stellen Sie sicher, dass, wenn Sie einfach den NAMEN des Befehls eingeben, genau auf die Binärdatei verwiesen wird, die dieselbe Bibliothek verwendet, oder überprüfen Sie besser, ob die Binärdatei, auf die Sie sich beziehen, den absoluten Pfad aufweist ist das gleiche, auf das Sie verweisen, wenn Sie die Konsole direkt verwenden. Die Binärdateien können mit dem Befehl find gefunden werden, zum Beispiel:

$locate python

Stellen Sie sicher, dass die Binärdatei, auf die Sie verweisen, mit der Binärdatei übereinstimmt, die Sie in Ihrer Shell aufrufen, oder testen Sie sie einfach erneut in Ihrer Shell unter Verwendung des absoluten Pfads, den Sie in den Cronjob einfügen möchten.

  • Eine weitere häufige Problemquelle ist die Syntax im Cronjob. Denken Sie daran, dass es Sonderzeichen gibt, die Sie für Listen (Kommas), zum Definieren von Bereichen (Striche -), zum Definieren von Inkrementen von Bereichen (Schrägstrichen) usw. verwenden können. Schauen Sie sich Folgendes an: http://www.softpanorama.org/Utilities/ cron.shtml
David L.
quelle
8

Unter Ubuntu können Sie eine cron.logDatei aktivieren , die nur die CRON-Einträge enthält.

Kommentieren Sie die cronin der /etc/rsyslog.d/50-default.confDatei erwähnte Zeile aus :

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Speichern und schließen Sie die Datei und starten Sie den rsyslogDienst neu:

sudo systemctl restart rsyslog

Sie können jetzt Cron-Protokolleinträge in einer eigenen Datei anzeigen:

sudo tail -f /var/log/cron.log

Beispielausgaben:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

Es werden jedoch keine weiteren Informationen darüber angezeigt, welche Skripte tatsächlich in /etc/cron.dailyoder ausgeführt wurden /etc/cron.hourly, es sei denn, diese Skripte leiten die Ausgabe direkt an cron.log (oder möglicherweise an eine andere Protokolldatei).

Wenn Sie überprüfen möchten, ob eine Crontab ausgeführt wird und nicht in cron.logoder danach suchen müssen syslog, erstellen Sie eine Crontab, die die Ausgabe in eine Protokolldatei Ihrer Wahl umleitet.

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Schritte von: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/

Gianfranco P.
quelle
Ubuntu 16.04 zeigte kein Cron-Protokoll an und diese Informationen haben es geschafft.
Pojda
5

cron sendet bereits die Standardausgabe und den Standardfehler jedes ausgeführten Jobs per E-Mail an den Eigentümer des Cron-Jobs.

Sie können MAILTO=recipientin der crontabDatei verwenden, um die E-Mails an ein anderes Konto zu senden.

Damit dies funktioniert, muss die E-Mail ordnungsgemäß funktionieren. Die Zustellung an eine lokale Mailbox ist normalerweise kein Problem (tatsächlich ls -l "$MAIL"wird sich wahrscheinlich herausstellen, dass Sie bereits welche erhalten haben), aber für die Zustellung aus der Box ins Internet ist der MTA (Postfix, Sendmail, was haben Sie) erforderlich richtig konfiguriert sein, um eine Verbindung zur Welt herzustellen.

Wenn keine Ausgabe erfolgt, wird keine E-Mail generiert.

Eine übliche Anordnung besteht darin, die Ausgabe in eine Datei umzuleiten. In diesem Fall sieht der Cron-Daemon natürlich nicht, dass der Job eine Ausgabe zurückgibt. Eine Variante besteht darin, die Standardausgabe in eine Datei umzuleiten (oder das Skript so zu schreiben, dass es nie etwas druckt - vielleicht speichert es stattdessen Ergebnisse in einer Datenbank oder führt Wartungsaufgaben aus, die einfach nichts ausgeben?) Und nur dann eine E-Mail zu erhalten, wenn es vorhanden ist ist eine Fehlermeldung.

Um beide Ausgabestreams umzuleiten, lautet die Syntax

42 17 * * * script >>stdout.log 2>>stderr.log

Beachten Sie, wie wir (doppelt >>) anhängen anstatt zu überschreiben, damit die Ausgabe eines vorherigen Jobs nicht durch die Ausgabe des nächsten ersetzt wird.

Wie in vielen Antworten hier vorgeschlagen, können beide Ausgabestreams an eine einzelne Datei gesendet werden. Ersetzen Sie die zweite Umleitung durch 2>&1"Standardfehler sollten überall dort auftreten, wo die Standardausgabe ausgeführt wird". (Aber ich unterstütze diese Vorgehensweise nicht besonders. Es ist vor allem dann sinnvoll, wenn Sie bei der Standardausgabe nicht wirklich etwas erwarten, aber möglicherweise etwas übersehen haben, das möglicherweise von einem externen Tool stammt, das von Ihrem Skript aufgerufen wird.)

cronJobs werden in Ihrem Home-Verzeichnis ausgeführt, daher sollten alle relativen Dateinamen relativ dazu sein. Wenn Sie außerhalb Ihres Home-Verzeichnisses schreiben möchten, müssen Sie natürlich separat sicherstellen, dass Sie Schreibzugriff auf diese Zieldatei haben.

Ein häufiges Antipattern besteht darin, alles umzuleiten /dev/null(und dann Stack Overflow zu bitten, um herauszufinden, was schief gelaufen ist, wenn etwas nicht funktioniert; aber wir können die verlorene Ausgabe auch nicht sehen!).

Stellen Sie in Ihrem Skript sicher, dass die regelmäßige Ausgabe (tatsächliche Ergebnisse, idealerweise in maschinenlesbarer Form) und die Diagnose (normalerweise für einen menschlichen Leser formatiert) getrennt sind. In einem Shell-Skript

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

Auf einigen Plattformen (und z. B. GNU Awk) können Sie den Dateinamen /dev/stderrfür Fehlermeldungen verwenden, dies ist jedoch nicht ordnungsgemäß portierbar. in Perl warnund dienach Standardfehler drucken; in Python schreiben sys.stderroder verwenden logging; Versuchen Sie es in Ruby $stderr.puts. Beachten Sie auch, wie Fehlermeldungen den Namen des Skripts enthalten sollten, das die Diagnosemeldung erstellt hat.

Tripleee
quelle
1

Wenn Sie einen Befehl mit sudo ausführen, wird dies nicht zugelassen. Sudo braucht einen tty.

Saad Masood
quelle
4
Dies hängt auch von der sudoKonfiguration ab. Dinge, die ohne die Möglichkeit zur Eingabe eines Kennworts ausgeführt werden müssen, sollten NOPASSWD:in Ihrer sudoersKonfiguration konfiguriert werden.
Tripleee
0

Wenn Sie Ihre Cron-Jobs weiterhin überprüfen möchten, sollten Sie beim Festlegen der Cron-Jobs in cPanel ein gültiges E-Mail-Konto angeben.

Wenn Sie eine gültige E-Mail-Adresse angeben, erhalten Sie die Ausgabe des ausgeführten Cron-Jobs. So können Sie es überprüfen und sicherstellen, dass alles korrekt ausgeführt wurde. Beachten Sie, dass Sie keine E-Mail erhalten, wenn der Befehl cron job keine Ausgabe enthält.

Bitte beachten Sie, dass Sie für jeden ausgeführten Cron-Job eine E-Mail erhalten. Dies kann Ihren Posteingang überfluten, falls Ihre Crones zu oft laufen

Faridul Khan
quelle