web-dev-qa-db-fra.com

Comment puis-je exécuter «date» à l'intérieur d'un travail crontab?

Je veux créer un fichier journal pour un script cron qui a l'heure actuelle dans le nom du fichier journal. Voici la commande que j'ai essayé d'utiliser:

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

Malheureusement, je reçois ce message lorsque cela s'exécute:

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

J'ai essayé d'échapper à la partie date de différentes manières, mais sans trop de chance. Est-il possible de faire cela en ligne dans un fichier crontab ou dois-je créer un script Shell pour ce faire?

131
cwd

Réponse courte:

Échapper au % comme \%:

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

Longue réponse:

Le message d'erreur suggère que le shell qui exécute votre commande ne voit pas le deuxième caractère de retour:

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

Ceci est également confirmé par le deuxième message d'erreur que vous avez reçu lorsque vous avez essayé l'une des autres réponses:

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

La page de manuel crontab confirme que la commande est en lecture seule jusqu'au premier _ % signe:

Le champ "sixième" (le reste de la ligne) spécifie la commande à exécuter. Toute la partie commande de la ligne, jusqu'à une nouvelle ligne ou % caractère, sera exécuté par /bin/sh ou par le Shell spécifié dans la variable Shell du fichier cron. Signes de pourcentage (%) dans la commande , sauf si échappé avec une barre oblique inverse (\), sera changé en caractères de nouvelle ligne , et toutes les données après le premier % sera envoyé à la commande comme entrée standard.

199
Adam Zalcman

Si vous souhaitez faire de la chaîne de formatage de la date une variable (pour éviter de dupliquer la chaîne entière), NE PAS échapper % Et NE PAS le mettre dans $()

Par exemple, tout en déclarant la chaîne, écrivez simplement:

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

Ensuite, écrivez l'instruction cron avec $($VARIABLE_NAME) comme ceci:

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

Merci à cyberx86, sa réponse à ServerFault pourrait être plus complet:

8
Gawi - Kai

Vous pouvez également placer vos commandes dans un fichier Shell, puis exécuter le fichier Shell avec cron.

jobs.sh

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

cron

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

Dans cron, vous pouvez utiliser cette syntaxe simple:

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

Toutes les réponses ci-dessus utilisent des guillemets doubles (toutes n'ont pas fonctionné pour ma configuration). Cela a fonctionné pour moi:

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

Une solution de base:

  • utilisez $() pour exécuter la commande date et renvoyer la sortie
  • formater datetime en UTC, échapper au % caractère avec \
  • ajouter 2>&1 à la fin pour diffuser à la fois stdout et stderr dans ce fichier journal

Exemple:

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

Production:

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