Wie kann ich `date` in einem Cron Tab Job ausführen?

117

Ich möchte eine Protokolldatei für ein Cron-Skript erstellen, dessen Protokolldateiname die aktuelle Stunde enthält. Dies ist der Befehl, den ich versucht habe:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

Leider bekomme ich diese Meldung, wenn das läuft:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

Ich habe versucht, dem dateTeil auf verschiedene Arten zu entkommen , aber ohne viel Glück. Ist es möglich, dies in einer Crontab-Datei inline auszuführen, oder muss ich ein Shell-Skript erstellen, um dies zu tun?

cwd
quelle

Antworten:

180

Kurze Antwort:

Entfliehen Sie dem %as \%:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log

Lange Antwort:

Die Fehlermeldung weist darauf hin, dass die Shell, die Ihren Befehl ausführt, das zweite hintere Häkchen nicht sieht:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '`'

Dies wird auch durch die zweite Fehlermeldung bestätigt, die Sie erhalten haben, als Sie eine der anderen Antworten ausprobiert haben:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

Die crontab-Manpage bestätigt, dass der Befehl nur bis zum ersten nicht entkappten %Zeichen gelesen wird :

Das "sechste" Feld (der Rest der Zeile) gibt den auszuführenden Befehl an. Der gesamte Befehlsteil der Zeile, bis auf eine neue Zeile oder ein neues %Zeichen, wird von /bin/shoder von der in der SHELLVariablen der Cron-Datei angegebenen Shell ausgeführt. Prozentzeichen ( %) im Befehl werden, sofern sie nicht mit einem Backslash ( \) versehen sind, in Zeilenumbrüche umgewandelt , und alle Daten nach dem ersten %werden als Standardeingabe an den Befehl gesendet.

Adam Zalcman
quelle
Entschuldigen Sie meine Unwissenheit, aber wo sehen Sie diese Fehlermeldungen? Wenn ich 'grep cron / var / log / syslog' ich keine Fehlermeldungen angezeigt werden , obwohl cron fehlgeschlagen - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe
2
@ Копать_Шо_я_нашел cron wird eine E-Mail mit der Fehlermeldung senden,
Jasen
3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode
7

Sie können Ihre Befehle auch in eine Shell-Datei einfügen und die Shell-Datei dann mit cron ausführen.

jobs.sh

echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log

cron

0 * * * * sh jobs.sh
Trevi Awater
quelle
6

Wenn Sie die Datumsformatierungszeichenfolge als Variable definieren möchten (um zu vermeiden, dass die gesamte Zeichenfolge dupliziert wird), müssen Sie sie NICHT mit einem Escape- Zeichen versehen% und NICHT eingeben$()

Wenn Sie beispielsweise die Zeichenfolge deklarieren, schreiben Sie einfach:

DATEVAR=date +%Y%m%d_%H%M%S

Dann schreibe cron statement mit $($VARIABLE_NAME)so:

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

Dank cyberx86 , seine / ihre Antwort auf ServerFault könnte mehr abgeschlossen werden:

Gawi - Kai
quelle
1
DATEVAR = "Datum +% Y% m% d_% H% M% S"
Frank Fang
3

In cron können Sie diese einfache Syntax verwenden:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1
bala4rtraining
quelle
Das Ausgabe-Datumsformat wird wie folgt neu
gestartet:
(1) Was sagst du, das die akzeptierte Antwort noch nicht gesagt hat? (2) Ihre Antwort ist viel komplizierter als die Frage. Sie haben beispielsweise die -dOption hinzugefügt , die in der Frage nicht verwendet wird (und Sie haben sie nicht erläutert). Wie rechtfertigen Sie diese "einfache Syntax"?
G-Man
2

Alle obigen Antworten verwenden doppelte Anführungszeichen (nicht alle haben für mein Setup funktioniert). Das hat bei mir funktioniert:

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1
Manuel Schmitzberger
quelle
1
Was sagen Sie, das in der akzeptierten Antwort noch nicht gesagt wurde? Wollen Sie damit sagen, dass es ohne Anführungszeichen besser funktioniert als mit Anführungszeichen? (Hinweis: Das ist sehr unwahrscheinlich.)
G-Man
Die akzeptierte Antwort funktioniert bei mir einfach nicht. Dieser tut es.
Manuel Schmitzberger
0

Eine grundlegende Lösung:

  • Verwenden Sie diese $()Option, um den dateBefehl auszuführen und die Ausgabe zurückzugeben
  • formatiere datetime auf UTC, verlasse das %Zeichen mit\
  • Fügen Sie 2>&1am Ende für das Streaming sowohl stdoutund stderrin diese Protokolldatei

Beispiel:

* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1

Ausgabe:

ls -lh /tmp | grep log

-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:06 crontab.log.20190504_050601Z
-rw-rw-r-- 1 ubuntu  ubuntu    17 May  4 05:07 crontab.log.20190504_050701Z
Hieu Huynh
quelle