stdout und stderr des Skripts werden bei der Ausführung von cron nicht umgeleitet

2548
gletscher

./script & >> log.txt

Ich bekomme eine schöne Logdatei, aber wenn ich den gleichen Befehl von cron ausgeführt habe, sagen wir, die Crontab sieht folgendermaßen aus:

* * * * * '/home/user/script &>> /home/user/log.txt' 

Die log.txt ist einfach leer, ich habe versucht "und" und "und keine Haken, um den Befehl einzuschließen. Haben Sie eine Idee, warum die Streams nicht in die Datei geschrieben werden?

3

2 Antworten auf die Frage

6
Dennis Williamson

Es ist möglich, dass die von cron verwendete Shell den von &>>Bash unterstützten Operator für die Umleitung von Kurzwahlen nicht unterstützt.

Sie sollten das portable Formular verwenden, das in der Bourne-Shell und anderen unterstützt wird:

* * * * * /home/user/script >> /home/user/log.txt 2>&1 

Das besagt "die Standardausgabe (Dateideskriptor 1) an die Datei anhängen und Standardfehler (Dateideskriptor 2) an dieselbe Stelle senden".

Und Sie brauchen keine Angebote.

+1 um auch den std-Fehler umzuleiten! Kein Wunder, dass nichts ausgegeben wird. User vor 7 Jahren 0
1
Jonathan Leffler
  1. Fügen Sie in der Crontab keine Anführungszeichen für den Befehl ein.

  2. Ziehen Sie in Betracht, ein Umgebungseinstellungsskript auszuführen, das seine eigene Umleitung ausführt, anstatt sich auf cron zu verlassen.

Nach meiner Erfahrung ist es umso besser, je weniger Dateien in der Crontab-Datei enthalten sind. Meine Crontab-Dateien bestehen aus den Zeitsteuerelementen sowie einem einfachen absoluten Befehlsnamen (ksh) und dem auszuführenden Befehl:

# @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $ # Crontab file for Home Directory for Jonathan Leffler (JL) #----------------------------------------------------------------------------- #Min Hour Day Month Weekday Command #----------------------------------------------------------------------------- 0 * * * * /usr/bin/ksh /work1/jleffler/bin/Cron/hourly 1 1 * * * /usr/bin/ksh /work1/jleffler/bin/Cron/daily 23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday 2 3 * * 0 /usr/bin/ksh /work1/jleffler/bin/Cron/weekly 21 3 1 * * /usr/bin/ksh /work1/jleffler/bin/Cron/monthly 
Ihr Punkt Nr. 1 ist ein bisschen irreführend (ich denke, Sie meinen "Zitiere nicht den ganzen Befehl"). * cron * verwendet normalerweise `/ bin / sh`, was durchaus mit Zitaten umgehen kann, aber die Zitate des OP wurden falsch verwendet (ebenso war die Umleitung nicht mit * sh * kompatibel). In einigen Versionen von * cron * können Crontab-Dateien angeben, welche Shell die Befehle interpretieren soll. In einem Crontab-Eintrag können daher möglicherweise die Funktionen und die Syntax Ihrer bevorzugten Shell verwendet werden. Zwar stimme ich zu, dass das Einhalten von Crontab-Einträgen ein guter Vorschlag ist. Chris Johnsen vor 14 Jahren 1
@Chris: yes - my statement is too sweeping and your analysis is correct. Thanks. Jonathan Leffler vor 14 Jahren 0