Antworten:
Überprüfen Sie, ob die Programme, die Sie mit cron ausführen, eigene Protokolldateien haben. Wenn sie ihre Ausgabe nicht auf die Standardausgaben schreiben, können Sie diese in Dateien umleiten oder per E-Mail an Sie senden. Innerhalb von Crontabs funktioniert die Standard-Shell-Umleitung .
Um beispielsweise die Fehlerausgabe von an umzuleiten und die Standardausgabe some_job.sh
zu some_job.err
verwerfen (dh an zu senden /dev/null
), fügen Sie Ihrer crontab die folgende Umleitung hinzu
33 3 * * * /path/to/some_job.sh 1> /dev/null 2> /other/path/to/some_job.err
oder um es dir zu schicken (falls mail
verfügbar)
33 3 * * * /path/to/some_job.sh 1> /dev/null 2>&1 | mail -s "cron output" you@example.org
/dev/null
?
some_job.sh
stdout nach /dev/null
und erst nach stderr nach stdout um (was jetzt selbst nichts mehr enthält). Auf diese Weise gelangt nur sein stderr zu stdout und wird an weitergeleitet mail
.
Die meisten Cron-Daemons auf Plattformen, mit denen ich gearbeitet habe, senden automatisch die Standard- / Standard-E-Mail der Benutzer-Cron-Jobs an den Benutzer, von dessen Cron-Registerkarte der Job stammt. Ich habe vergessen, was systemweit passiert (nicht benutzerspezifische Cron-Jobs aus / etc / crontab). Die Sache ist, dass Leute auf den meisten Unix-ähnlichen Betriebssystemen nicht mehr immer einen Mailer-Daemon (dh einen Mail Transfer Agent (MTA) wie sendmail, qmail oder postfix) einrichten. Die Cron-Job-Ausgabe-E-Mails sterben also einfach irgendwo in einem lokalen Mail-Spool-Ordner, wenn sie überhaupt so weit kommen. Eine Antwort könnte darin bestehen, Ihren Mailer-Daemon zu starten und sicherzustellen, dass Sie eine ~ / .forward-Datei haben, um Ihre lokale Mail an Ihr "echtes" E-Mail-Konto weiterzuleiten.
Wenn Sie möchten, dass Ihre Jobs in bestimmte Protokolldateien geschrieben werden, können Sie die Standardausgabeumleitung wie in @honk vorgeschlagen verwenden. Angenommen, Ihr Cron-Job ist ein Shell-Skript, haben Sie Ihren Skriptaufruf-Logger (1) oder Syslog (1) oder Unabhängig davon, welches andere Befehlszeilentool Ihr Betriebssystem zum Senden beliebiger Nachrichten an Syslog bereitstellt. Dann können Sie die in Ihrem Betriebssystem integrierten Methoden verwenden, um zu konfigurieren, welche Arten von Nachrichten wo protokolliert werden, indem Sie möglicherweise /etc/syslog.conf bearbeiten.
Die meisten meiner Cron-Jobs rufen Bash-Skripte auf, die ich speziell geschrieben habe, um aus einem bestimmten Grund von Cron gestartet zu werden. Insbesondere wenn ich sie zum ersten Mal schreibe und debugge, verwende ich gerne bashs "set -vx", um die nicht erweiterte und erweiterte Form jeder Zeile des Shell-Skripts vor der Ausführung in stdout zu schreiben. Beachten Sie, dass Shell-Skripte, die mit cron gestartet wurden, als nicht angemeldete, nicht interaktive Shells betrachtet werden, sodass Ihre Standard-Shell-Startskripte wie .bashrc und .profile nicht ausgeführt werden. Wenn Sie bash verwenden und möchten, dass bash ein Startskript ausführt, müssen Sie in Ihrer crontab vor der Zeile, in der Sie den Job definieren, eine Umgebungsvariable "BASH_ENV = / path / to / my / startup / script" definieren.
mail
Befehl verwenden, um Nachrichten von der Befehlszeile aus zu lesen. Oder schauen Sie sich an /var/spool/mail
. Wenn Sie jedoch Postfix oder einen anderen Mailer als Standard-Sendmail installiert haben, ist eine andere Methode zum Lesen von Nachrichten erforderlich.
mail -s "cron output" test@example.com
funktioniert ganz gut: /
less $MAIL
wenn Sie cron - Ausgang für den aktuellen Benutzer sehen wollen , oder less /var/spool/mail/root
wenn Sie wollen für Befehle cron Ausgabe sehen als root ausgeführt wird .
Am einfachsten ist es, Druckfehler zu erfassen und dann in einer Datei zu speichern. Ich habe einen Cronjob, der eine PHP-Kommandozeile aufruft:
1 0 * * * php /pathOfMyApp/index.php controllerName functionName> /pathOfMyApp / log / myErrorLog 2> & 1
Der Teil vor '>' ist mein Cronjob und nach '>' das Erfassen und Speichern in einer Datei, die sich in einem Protokollordner im Stammverzeichnis meines Projekts befindet, sich aber möglicherweise an der gewünschten Stelle befindet. Seien Sie wachsam: Jedes Mal, wenn cronjob aufgerufen wird, überschreibt er das letzte Protokoll. Sie können '>>' verwenden, um am Ende einer vorhandenen Datei zu schreiben oder nach dem Terminalbefehl 'cat' zu suchen.
Wenn Ihre crontab 'curl' oder 'wget' verwendet und auf einen Link verweist, können Sie in / var / log / httpd / appName nach access-log suchen, wenn cron mit 500 oder 400 zurückkehrt, muss etwas falsch sein.
Endlich können Sie auch / var / log / messages überprüfen.
Ich denke, dass das Umleiten innerhalb der Cron-Datei in diesem Fall möglicherweise nicht die beste Option ist.
Häufig soll die Protokollierungsspezifikation zusammen mit dem Cron-Job-Skript gespeichert werden. In diesem Fall schlage ich Folgendes vor:
#!/bin/bash
exec &>> capture-log.txt
echo "Running cron-job foo at $(date)"
...
<rest of script>
Dadurch wird die Ausgabe des Cron-Jobs an die Datei capture-log.txt angehängt.
Ich möchte lieber E-Mail-Berichte über Cron-Jobs erhalten. Einfach setzen
MAILTO=yourmail@domain.com
In crontab und Sie erhalten eine E-Mail. Natürlich muss die E-Mail-Adresse für Ihren Account konfiguriert sein.