Les cronjobs ne s’exécutent pas bien qu’ils soient présents dans syslog

J’ai configuré certaines tâches dans root crontab comme:

1 * * * * zcat -f /var/log/apache2/custom.site1.log.* | goaccess --log-format COMMON -o /var/www/site1/reports/index.html 2 * * * * zcat -f /var/log/apache2/error.site1.log.* | goaccess --log-format='[%^ %d %t.%^ %^] [%^] [%^] [%^ %h:%^] %^: %U, %^: %R' --time-format=%T --date-format='%b %d' --http-protocol=no --http-method=no -o /var/www/site1/reports/errors.html 

Avec un cat /var/log/syslog | grep CRON cat /var/log/syslog | grep CRON , je vois que ça commence toutes les heures comme il se doit:

 Jan 29 12:05:01 sd-102290 CRON[21454]: (root) CMD (zcat -f /var/log/apache2/error.site1.log.* | goaccess --log-format='[) Jan 29 12:05:01 sd-102290 CRON[21465]: (root) CMD (zcat -f /var/log/apache2/custom.site1.log.* | goaccess --log-format COMMON -o /var/www/site1/reports/index.html) 

Mais ça ne marche pas. La commande fonctionne comme un charme lorsqu’elle est exécutée depuis la ligne de commande. Je ne sais pas où je pourrais regarder des erreurs provenant de ce cron.

De plus, je vois que ma commande semble tronquée dans le syslog (ça s’arrête à goaccess --log-format='[ )

Merci


Le problème est que la commande que vous souhaitez exécuter contient le caractère % . Selon le manuel crontab, un % est considéré comme la fin de la commande et tout ce qui suit le % est une entrée standard pour la commande. Si votre commande nécessite un % tel que des chaînes de format général printf ou date , vous devez échapper au % .

man 5 crontab

Le “sixième” champ (le rest de la ligne) spécifie la commande à exécuter. Toute la partie commande de la ligne, jusqu’à une nouvelle ligne ou un caractère ” % “, sera exécutée par /bin/sh ou par le shell spécifié dans la variable SHELL du fichier cronfile. Un caractère ” % ” dans la commande, à moins qu’il ne soit échappé avec une barre oblique inverse ( \ ), sera transformé en caractères de nouvelle ligne et toutes les données après le premier % seront envoyées à la commande en tant qu’entrée standard.

Donc, si vous avez une commande du type:

 #!/usr/bin/env zsh read foo echo $foo 

et le crontab lit:

 # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) # | | | | | # * * * * * command to be executed 1 * * * * cmd > ~/foo % hello world 1 * * * * printf "hello \%s\n" universe > ~/bar 

Le fichier ~/foo contiendra le contenu hello world et ~/bar contiendra hello universe (et non hello \universe ).