Come posso eseguire `date` all'interno di un lavoro cron tab?


117

Voglio creare un file di registro per uno script cron che ha l'ora corrente nel nome del file di registro. Questo è il comando che ho provato a usare:

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

Purtroppo ricevo questo messaggio quando viene eseguito:

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

Ho provato a sfuggire alla dateparte in vari modi, ma senza molta fortuna. È possibile farlo accadere in linea in un file crontab o devo creare uno script di shell per farlo?

Risposte:


180

Risposta breve:

Sfuggire a %come \%:

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

Risposta lunga:

Il messaggio di errore suggerisce che la shell che esegue il comando non vede il secondo carattere di spunta indietro:

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

Ciò è confermato anche dal secondo messaggio di errore che hai ricevuto quando hai provato una delle altre risposte:

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

La manpage di crontab conferma che il comando è letto solo fino al primo %segno senza caratteri di escape :

Il "sesto" campo (il resto della riga) specifica il comando da eseguire. L'intera porzione di comando della riga, fino a una nuova riga o %carattere, sarà eseguita dalla /bin/sho dalla shell specificata nella SHELLvariabile del cronfile. I segni di percentuale ( %) nel comando, a meno che non vengano salvati con la barra rovesciata ( \), verranno modificati in caratteri di nuova riga e tutti i dati dopo il primo %verranno inviati al comando come input standard.


Scusate la mia ignoranza, ma dove vedete questi messaggi di errore? Quando faccio 'grep CRON / var / log / syslog' non vedo messaggi di errore, anche se cron non è riuscito - kagda.ru/i/9a016249a39_20-05-2015-09:22:47_9a01.png
Tebe

2
@ Копать_Шо_я_нашел cron invierà un'email con il messaggio di errore,
Jasen

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

7

Puoi anche inserire i tuoi comandi in un file shell e quindi eseguire il file shell con cron.

jobs.sh

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

cron

0 * * * * sh jobs.sh

6

Se desideri rendere la stringa di formattazione della data come variabile (per evitare di duplicare l'intera stringa), NON scappare %e NON inserirla$()

Ad esempio, mentre dichiari la stringa, scrivi semplicemente:

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

Quindi, scrivi cron statement in $($VARIABLE_NAME)questo modo:

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

Grazie a cyberx86 , la sua risposta a ServerFault potrebbe essere più completa:


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

3

In cron, puoi usare questa semplice sintassi:

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

Il formato della data di uscita verrà riavviato come cron_20180123.log
bala4rtraining

(1) Cosa stai dicendo che non è già stato detto dalla risposta accettata? (2) La tua risposta è molto più complicata della domanda. Ad esempio, hai aggiunto l' -dopzione, che non viene utilizzata nella domanda (e non l'hai spiegata). Come giustifica chiamare questa "sintassi semplice"?
G-Man il

2

Tutte le risposte di cui sopra usano virgolette doppie (non tutte hanno funzionato per la mia configurazione). Questo ha funzionato per me:

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

1
Cosa stai dicendo che non è già stato detto dalla risposta accettata? Stai dicendo che funziona meglio senza virgolette che con le virgolette? (Suggerimento: è molto improbabile.)
G-Man il

La risposta accettata semplicemente non funziona per me. Questo lo fa.
Manuel Schmitzberger,

0

Una soluzione di base:

  • utilizzare $()per eseguire il datecomando e restituire l'output
  • formattare datetime in UTC, sfuggire al %personaggio con\
  • aggiungere 2>&1alla fine per lo streaming sia stdoute stderrnel file di registro

Esempio:

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

Produzione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.