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

3

./script & >> log.txt

Ich bekomme eine nette Logdatei, aber wenn ich den gleichen Befehl von cron ausführen lasse, kann man sagen, dass die crontab so aussieht:

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

Die log.txt wird einfach leer sein, ich habe versucht "und" und keine Häkchen, um den Befehl einzuschließen, eine Idee, warum die Streams nicht in die Datei geschrieben werden?

Gletscher
quelle

Antworten:

6

Möglicherweise unterstützt die von cron verwendete Shell den von &>>Bash unterstützten Umleitungsoperator nicht .

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

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

Dort heißt es: "Hänge die Standardausgabe (Dateideskriptor 1) an die Datei an und sende den Standardfehler (Dateideskriptor 2) an dieselbe Stelle."

Und du brauchst keine Zitate.

Dennis Williamson
quelle
+1 für die Umleitung des Standardfehlers! Kein Wunder, dass es nichts ausgibt.
User
1
  1. Fügen Sie keine Anführungszeichen für den Befehl in die crontab ein.

  2. Erwägen Sie, ein Umgebungseinstellungsskript auszuführen, das seine eigene Umleitung ausführt, anstatt sich dabei auf cron zu verlassen.

Je weniger sich meiner Erfahrung nach in der crontab-Datei befindet, desto besser. 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
Jonathan Leffler
quelle
1
Ihre Nummer 1 ist ein bisschen irreführend (ich denke, Sie meinen "Zitieren Sie nicht den gesamten Befehl."). In der Regel verwendet cron etwas,/bin/sh das mit Quotierungen durchaus umgehen kann, aber die OP-Quotes wurden falsch verwendet (ebenfalls war die Umleitung nicht sh- kompatibel). In einigen Versionen von cron können crontab-Dateien angeben, welche Shell die Befehle interpretieren soll, sodass die Funktionen und die Syntax Ihrer bevorzugten Shell möglicherweise direkt in einem crontab-Eintrag verwendet werden können. Allerdings stimme ich zu, dass es ein guter Vorschlag ist, crontab-Einträge einfach zu halten.
Chris Johnsen
@ Chris: Ja - meine Aussage ist zu pauschal und Ihre Analyse ist korrekt. Vielen Dank.
Jonathan Leffler