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?
Échapper au %
comme \%
:
0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+\%d"`.log
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 variableShell
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.
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:
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
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
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
$()
pour exécuter la commande date
et renvoyer la sortie%
caractère avec \
2>&1
à la fin pour diffuser à la fois stdout
et stderr
dans ce fichier journal* * * * * 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