Wie leite ich die Ausgabe von Cron in eine Datei um?

105

Ich habe ein Sicherungsskript, das ich zu einer bestimmten Tageszeit ausführen muss, damit ich es cronfür diese Aufgabe verwende. Außerdem versuche ich von cron aus, die Ausgabe des Sicherungsskripts an a umzuleiten logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

Im obigen Cron-Eintrag leite ich beide stderr and stdoutin eine Protokolldatei um.

Der obige Cron-Job wird ordnungsgemäß ausgeführt syslog und führt die in der backup.shDatei angegebene Aufgabe aus, schreibt jedoch nichts in die Protokolldatei.

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

Wenn ich das Skript von CLI aus starte, funktioniert es wie erforderlich und die Ausgabe wird in eine Protokolldatei geschrieben

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

Warum wird die Ausgabe der Datei nicht von cron aus in die Datei umgeleitet?

RanRag
quelle

Antworten:

158

Ich habe das Problem gelöst. Es gibt zwei Möglichkeiten:

M1

Ändern Sie die Umleitung von &>>nach 2>&1. So crontab -esieht das jetzt aus

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

Ich glaube, das oben genannte funktioniert, weil standardmäßig verwendet cronwird sh, um die Aufgabe auszuführen, anstatt bashso &>>nicht unterstützt wird sh.

M2

Ändern Sie die Standard-Shell, indem Sie sie SHELL=/bin/bashin die crontab -eDatei einfügen.

RanRag
quelle
14
cronist wie sh: es wählt kein einziges Programm aus. Es gibt viele Implementierungen. Die am weitesten verbreitete Implementierung ist Vixie Cron. Ich bin der (aktuelle, nicht der ursprüngliche) Autor eines anderen. Ich glaube, dass die meisten Cron-Daemons das System verwenden sh, aber das kann variieren, ob es akzeptiert &>>. Einige Cron-Daemons (wie meine) ermöglichen es Ihnen nicht, zu ändern, welche Shell die Cron-Zeilen mit SHELL=...Zeilen in der Crontab ausführt . Ich bin froh, dass Sie eine Lösung gefunden haben, die für Sie funktioniert. Ich dachte, es lohnt sich darauf hinzuweisen, dass es viele Variablen gibt, die sich darauf auswirken können, ob es für andere funktioniert.
dubiousjim
Wie füge ich YYYY-MM-DD_hh-mm-secin die Ausgabe einen Dateinamen ein, damit jeder Dateiname anders ist und ohne Umschreiben erhalten bleibt?
Danijel
1
@ Danijel: Dies sollte helfen, serverfault.com/questions/117360/…
RanRag
2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logmacht das gleiche auch.
Yanick Girouard
5

Haftungsausschluss [1].

Ich möchte eine Fußnote oder einen Nachtrag zur Antwort von @ RanRag hinzufügen .

Stellen Sie sicher, dass Ihre Shell-Umleitungssyntax übereinstimmt /bin/sh. Wenn Sie versuchen, eine Shell-Umleitungssyntax zu verwenden, die mit nicht gültig ist, schlägt /bin/shIhr Befehl fehl und Ihr Cron-Job wird nie ausgeführt.

/etc/cron.d/example1Wenn Sie in Ihren Konfigurationsdateien einen anderen Benutzer als angeben rootund die Anmeldeshell dieses Benutzers nicht /bin/bash..., müssen Sie im /etc/cron.d/example1Befehl weiterhin die Syntax / bin / sh verwenden .


Zum Beispiel

Wenn Ihr Benutzer eine Shell hat cshoder zshoder kshfür seine Login-Shell eingestellt ist. In Ihrer /etc/cron.d/example1Konfigurationsdatei muss der Befehl /bin/shSyntax verwenden. Insbesondere muss jede Shell-Umleitung eine /bin/shSyntax haben.

Wenn Sie beispielsweise versuchen, die cshShell-Redirect-Syntax in Ihrem zu verwenden /etc/cron.d/example1, wird Ihr Cron-Job niemals ausgeführt. In der Protokolldatei für das Verzeichnis crondat /var/log/cronsoll angegeben werden, dass der Befehl ausgeführt wird, der Befehl jedoch einen Syntaxfehler aufweist, bevor der Befehl ausgeführt wird.

Wo werden crondFehlermeldungen für einen Syntaxfehler ausgegeben?

Der Fehler wird nie in gemeldet /var/log/cron. crondstattdessen werden standardmäßig Fehlermeldungen mit ausgegeben mail. Sie müssen also überprüfen /var/spool/mail/${USER}, um zu sehen, was der Fehler ist.

[1]

Haftungsausschluss

  • Diese Antwort setzt ein sysvSystem voraus
  • systemd Informationen können abweichen
  • Diese Informationen wurden speziell für die centos-6Distribution entwickelt und gelten möglicherweise nicht für verschiedene sysvDistributionen
    • Ich erwähne es centos-6ausdrücklich, weil verschiedene Distributionen eine andere crondImplementierung haben können, die sich von der unterscheidetcentos-6
Trevor Boyd Smith
quelle
2
Wenn Sie möchten, dass Ihr /etc/cron.d/example1Befehl eine andere Shell verwendet, können Sie set SHELL=in Ihrer /etc/cron.d/example1Konfigurationsdatei verwenden.
Trevor Boyd Smith