• Home  / 
  • Linux
  •  /  Utiliser la fonction date dans une crontab

Utiliser la fonction date dans une crontab

By KrustyHack / a couple of years ago

Crontab

Tout le monde connait le système de crontab Linux ? Non ? Bah en fait c’est un système qui permet d’effectuer des actions chroniques. C’est pas plus compliqué que ça ! Vous pouvez par exemple décider que tous les vendredi à 8h00 vous envoyez un mail automatique à votre patron pour dire que vous êtes en retard, comme d’hab. Bon après on peut effectuer des actions plus sérieuses comme effectuer des backups réguliers, intégrer des données, etc… Mais c’est moins fun.

La fonction date dans une crontab

Alors cela peut paraître tout con mais utiliser la fonction date dans une crontab c’est source de pièges ! Enfin en tout cas pour ceux, comme moi, qui ne lise pas trop les docs, ou alors le début et la fin, pour faire genre.

Le problème

Donc, notre fonction date peut s’appeler de mutliples façon. Toutefois, quand on veut formatter sa sortie (genre pour mettre dans un nom de fichier de backup), on fait un truc du style:

╭─root@krustyhack ~ 
╰─➤ date +%H%M%s-%d%m%Y
10321426671179-18032015

Bah oui, si on veut faire un backup d’une base mysql par exemple, on veut mettre la date dans le nom du fichier:

╭─root@krustyhack ~  
╰─➤ mysqldump --add-drop-table -u UTILISATEUR -pPASSWORD MABASE > /var/archives/dump-$(date +%H%M%s-%d%m%Y)-MABASE.sql

Alors ça, ça marche niquel en ligne de commande, ok soucis. Mais essayez voir dans une crontab ! Nah ! Ca passe pas!

Dès son exécution, on reçoit une erreur:

/bin/sh: 1: Syntax error: end of file unexpected (expecting ")")

La solution

Alors bon, vous allez me dire « oui mais t’avais qu’à lire la doc de crontab ! ». Je suis d’accord mais bon, je suis un peu feignant et puis Google est là donc pourquoi me faire chier à lire une doc. Et puis merde, si j’avais pas buté sur ce problème, il n’y aurait pas cet article ! Ha ! Enfin bref, voilà la solution (extrait de la doc :p):

Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

Ah, ok. C’était juste ça. On met du \ avant les % et bim, ça marche:

╭─root@krustyhack ~  
╰─➤ mysqldump --add-drop-table -u UTILISATEUR -pPASSWORD MABASE > /var/archives/dump-$(date +\%H\%M\%s-\%d\%m\%Y)-MABASE.sql

Et voilà, notre cron va pouvoir tourner ! Bon après on est un peu con car en général, échapper un caractère c’est avec du \ qu’on le fait. Alors je ne sais pas pourquoi je n’y ai pas pensé. Bref.

Merci à LogikDev pour la solution (qui a donné cet article, au final).

Leave a comment: