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 variableSHELL
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
).