Petit retour sur une spécificité de la crontab

Billet posté le 28 mai 2016

Crontab : tu veux nous apprendre quoi ?

Oui, effectivement un article sur la crontab c’est du vu et revu. Je vais simplement faire un retour sur un truc qui m’est arrivé il y a peu et que j’ai mis un temps certain voire un certain temps à résoudre. Le besoin est très simple à la base. J’ai un dépôt git et je souhaite réaliser une sauvegarde tous les jours de celui-ci sur mon NAS. Bref, je me suis dit allez hop on lance un crontab -e et c’est parti pour :

crontab -e
15 22 * * * cd /home/git && tar cfz /backup/git/hindy.lovetux.net-$(/bin/date +%d).tgz hindy.lovetux.net.git

Et là c’est le drame il se passe rien. Premier réflexe : je me suis trompé dans la syntaxe de la crontab ou alors mes commandes font des sorties sur stdout. Nope c’était pas du tout ça. Donc je me suis rendu dans /var/log/syslog et dedans je vois ceci :

orion CRON[28981]: (root) CMD (cd /home/git && tar cfz /backup/git/hindy.lovetux.net-$(date "+)

Et là je comprends que soit la ligne est tronquée soit il y a un problème. Je me rends alors compte qu’il manque tout ce qu’il y a après le caractère %. Je commence à investiguer un peu sur google et j’apprends qu’il est nécessaire d’échapper le caractère % dans une entrée crontab.

De ce fait l’entrée correcte dans la crontab est donc :

15 22 * * * cd /home/git && tar cfz /backup/git/hindy.lovetux.net-$(/bin/date +\%d).tgz hindy.lovetux.net.git

Et enfin dans /var/log/syslog on retrouve ceci :

May 27 22:15:01 orion CRON[13118]: (root) CMD (cd /home/git && tar cfz /backup/git/hindy.lovetux.net-$(/bin/date +%d).tgz hindy.lovetux.net.git)

Et donc l’explication ?

On apprend en fait que le caractère % dans une commande, à moins que celui-ci soit échappé, sera interprété comme une nouvelle ligne.

Les versions utilisées

hindy@orion:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.4 LTS
Release:        14.04
Codename:       trusty
hindy@orion:~$ uname -a
Linux orion 3.13.0-86-generic #130-Ubuntu SMP Mon Apr 18 18:27:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
hindy@orion:~$ dpkg -l | grep cron
ii  cron                                  3.0pl1-124ubuntu2                    amd64        process scheduling daemon
hindy@orion:~$

Et enfin : RTFM

man 5 crontab