it-swarm-eu.dev

Jak mohu provést `date` uvnitř crontab úlohy?

Chci vytvořit soubor protokolu pro skript cron, který má v názvu souboru protokolu aktuální hodinu. Tento příkaz jsem se pokusil použít:

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

Tuto zprávu bohužel dostanu, když se spustí:

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

Snažil jsem se uniknout části date různými způsoby, ale bez velkého štěstí. Je možné, aby se to stalo přímo v souboru crontab, nebo musím vytvořit skript Shell, abych to udělal?

131
cwd

Stručná odpověď:

Unikněte % Jako \%:

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

Dlouhá odpověď:

Chybová zpráva naznačuje, že prostředí, které vykonává váš příkaz, nevidí druhý znak znaku zpět:

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

Potvrzuje to také druhá chybová zpráva, kterou jste obdrželi, když jste vyzkoušeli některou z dalších odpovědí:

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

crontab manpage potvrzuje, že příkaz je načten až po první neuzavřený znak %:

Pole „šesté“ (zbytek řádku) určuje příkaz, který má být spuštěn. Celá příkazová část řádku, až po nový řádek nebo znak %, Bude vykonána pomocí /bin/sh Nebo Shell specifikovaným v proměnné Shell cronfile. Znak procenta (%) V příkazu , ledaže by byl opuštěn zpětným lomítkem (\), Se změní na znaky nového řádku a všechna data po prvních % budou odeslány na příkaz jako standardní vstup.

199
Adam Zalcman

Pokud si přejete, aby byl řetězec formátující datum jako proměnná (aby nedocházelo k duplikování celého řetězce), NEVYDÁVEJTE únik % A NEPOSKYTUJTE do funkce $()

Například když deklarujete řetězec, napište:

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

Poté napište příkaz cron s $($VARIABLE_NAME) takto:

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

Díky cyberx86, její odpověď na ServerFault může být dokončen:

8
Gawi - Kai

Můžete také vložit své příkazy do souboru Shell a poté spusťte soubor Shell pomocí cronu.

jobs.sh

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

cron

0 * * * * sh jobs.sh
7
Trevi Awater

V cronu můžete použít tuto jednoduchou syntaxi:

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

Všechny výše uvedené odpovědi používají dvojité uvozovky (ne všechny z nich fungovaly pro mé nastavení). To pro mě fungovalo:

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

Základní řešení:

  • použijte $() k provedení příkazu date a návratu výstupu
  • formátovat datetime na UTC, uniknout % znak s \
  • přidat 2>&1 na konci pro streamování stdout a stderr do tohoto souboru protokolu

Příklad:

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

Výstup:

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
0
Hieu Huynh