Jak mogę wykonać `date` wewnątrz zadania karty cron?


117

Chcę utworzyć plik dziennika dla skryptu cron, który ma bieżącą godzinę w nazwie pliku dziennika. Oto polecenie, którego próbowałem użyć:

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

Niestety pojawia się ten komunikat, gdy działa:

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

Próbowałem uciec przed tą dateczęścią na różne sposoby, ale bez większego szczęścia. Czy jest to możliwe, aby stało się to in-line w pliku crontab, czy muszę utworzyć skrypt powłoki, aby to zrobić?

Odpowiedzi:


180

Krótka odpowiedź:

Escape the %as \%:

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

Długa odpowiedź:

Komunikat o błędzie sugeruje, że powłoka, która wykonuje polecenie, nie widzi drugiego tylnego znaku tyka:

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

Potwierdza to również drugi komunikat o błędzie otrzymany podczas wypróbowania jednej z pozostałych odpowiedzi:

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

Strona podręcznika crontab potwierdza, że ​​polecenie jest odczytywane tylko do pierwszego nieskalowanego %znaku:

„Szóste” pole (reszta wiersza) określa polecenie do uruchomienia. Cała część polecenia wiersza, aż do nowej linii lub %znaku, będzie wykonywana przez /bin/shpowłokę lub przez powłokę określoną w SHELLzmiennej pliku cron. Znaki procentu ( %) w poleceniu, chyba że poprzedzone \ znakiem odwrotnym ukośnikiem ( ), zostaną zamienione na znaki nowej linii , a wszystkie dane po pierwszym %zostaną przesłane do polecenia jako standardowe wejście.


Przepraszam za moją ignorancję, ale gdzie widzisz te komunikaty o błędach? Kiedy robię 'grep CRON / var / log / syslog', nie widzę komunikatów o błędach, chociaż cron się nie powiedzie - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe

2
@ Копать_Шо_я_нашел cron wyśle ​​wiadomość e-mail z komunikatem o błędzie,
Jasen

3
date +\%Y\ \%m\ \%d\ \%H:\%M:\%S-cronlog
DevilCode

7

Możesz także umieścić swoje polecenia w pliku powłoki, a następnie uruchomić plik powłoki za pomocą crona.

jobs.sh

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

cron

0 * * * * sh jobs.sh

6

Jeśli chcesz ustawić ciąg formatowania daty jako zmienną (aby uniknąć duplikowania całego ciągu), NIE uciekaj %i NIE wkładaj go$()

Na przykład, deklarując ciąg, po prostu napisz:

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

Następnie napisz instrukcję cron w $($VARIABLE_NAME)następujący sposób:

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

Dzięki cyberx86 , jej / jego odpowiedź na ServerFault może być bardziej kompletny:


1
DATEVAR = "data +% Y% m% d_% H% M% S"
Frank Fang

3

W cronie możesz użyć tej prostej składni:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1

Format daty wyjściowej zostanie zrestartowany jak cron_20180123.log
bala4rtraining 24.01.2018

(1) Co mówisz, że nie zostało jeszcze powiedziane przez zaakceptowaną odpowiedź? (2) Twoja odpowiedź jest znacznie bardziej skomplikowana niż pytanie. Na przykład dodałeś -dopcję, która nie jest używana w pytaniu (i nie wyjaśniłeś jej). Jak usprawiedliwiasz tę „prostą składnię”?
G-Man,

2

Wszystkie powyższe odpowiedzi używają podwójnych cudzysłowów (nie wszystkie działały w mojej konfiguracji). To działało dla mnie:

0 5 * * 3 /data/script.sh > /data/script_`date +\%y\%m\%d`.log 2>&1

1
Co mówisz, że nie zostało jeszcze powiedziane w zaakceptowanej odpowiedzi? Czy mówisz, że działa lepiej bez cudzysłowów niż z cudzysłowami? (Wskazówka: to bardzo mało prawdopodobne.)
G-Man,

Przyjęta odpowiedź po prostu nie działa dla mnie. Ten robi.
Manuel Schmitzberger,

0

Podstawowe rozwiązanie:

  • służy $()do wykonywania datepoleceń i zwraca dane wyjściowe
  • sformatuj datetime do UTC, usuń %znak za pomocą\
  • dodać 2>&1na końcu do strumieniowego przesyłania zarówno stdouti stderrdo tego pliku dziennika

Przykład:

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

Wynik:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.