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?
Unikněte %
Jako \%
:
0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log
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.
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:
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
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
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
$()
k provedení příkazu date
a návratu výstupu%
znak s \
2>&1
na konci pro streamování stdout
a stderr
do tohoto souboru protokolu* * * * * echo "Test crontab log" > /tmp/crontab.log.$(date --utc +\%Y\%m\%d_\%H\%M\%SZ) 2>&1
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