Ich habe ein Sicherungsskript, das ich zu einer bestimmten Tageszeit ausführen muss, damit ich es cron
fü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 stdout
in eine Protokolldatei um.
Der obige Cron-Job wird ordnungsgemäß ausgeführt syslog
und führt die in der backup.sh
Datei 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?
bash
io-redirection
cron
RanRag
quelle
quelle
Antworten:
Ich habe das Problem gelöst. Es gibt zwei Möglichkeiten:
M1
Ändern Sie die Umleitung von
&>>
nach2>&1
. Socrontab -e
sieht das jetzt ausIch glaube, das oben genannte funktioniert, weil standardmäßig verwendet
cron
wirdsh
, um die Aufgabe auszuführen, anstattbash
so&>>
nicht unterstützt wirdsh
.M2
Ändern Sie die Standard-Shell, indem Sie sie
SHELL=/bin/bash
in diecrontab -e
Datei einfügen.quelle
cron
ist wiesh
: 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 verwendensh
, aber das kann variieren, ob es akzeptiert&>>
. Einige Cron-Daemons (wie meine) ermöglichen es Ihnen nicht, zu ändern, welche Shell die Cron-Zeilen mitSHELL=...
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.YYYY-MM-DD_hh-mm-sec
in die Ausgabe einen Dateinamen ein, damit jeder Dateiname anders ist und ohne Umschreiben erhalten bleibt?*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log
macht das gleiche auch.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/sh
Ihr Befehl fehl und Ihr Cron-Job wird nie ausgeführt./etc/cron.d/example1
Wenn Sie in Ihren Konfigurationsdateien einen anderen Benutzer als angebenroot
und die Anmeldeshell dieses Benutzers nicht/bin/bash
..., müssen Sie im/etc/cron.d/example1
Befehl weiterhin die Syntax / bin / sh verwenden .Zum Beispiel
Wenn Ihr Benutzer eine Shell hat
csh
oderzsh
oderksh
für seine Login-Shell eingestellt ist. In Ihrer/etc/cron.d/example1
Konfigurationsdatei muss der Befehl/bin/sh
Syntax verwenden. Insbesondere muss jede Shell-Umleitung eine/bin/sh
Syntax haben.Wenn Sie beispielsweise versuchen, die
csh
Shell-Redirect-Syntax in Ihrem zu verwenden/etc/cron.d/example1
, wird Ihr Cron-Job niemals ausgeführt. In der Protokolldatei für das Verzeichniscrond
at/var/log/cron
soll angegeben werden, dass der Befehl ausgeführt wird, der Befehl jedoch einen Syntaxfehler aufweist, bevor der Befehl ausgeführt wird.Wo werden
crond
Fehlermeldungen für einen Syntaxfehler ausgegeben?Der Fehler wird nie in gemeldet
/var/log/cron
.crond
stattdessen werden standardmäßig Fehlermeldungen mit ausgegebenmail
. Sie müssen also überprüfen/var/spool/mail/${USER}
, um zu sehen, was der Fehler ist.[1]
Haftungsausschluss
sysv
System voraussystemd
Informationen können abweichencentos-6
Distribution entwickelt und gelten möglicherweise nicht für verschiedenesysv
Distributionencentos-6
ausdrücklich, weil verschiedene Distributionen eine anderecrond
Implementierung haben können, die sich von der unterscheidetcentos-6
quelle
/etc/cron.d/example1
Befehl eine andere Shell verwendet, können Sie setSHELL=
in Ihrer/etc/cron.d/example1
Konfigurationsdatei verwenden.