尽管存在于syslog中,但Cronjobs不会执行

时间:2018-01-29 11:44:17

标签: unix cron

我在root crontab中配置了一些任务,如:

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

使用cat /var/log/syslog | grep CRON,我发现它每小时就像它应该的那样开始:

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)

但它不起作用。从命令行执行时,该命令就像一个魅力。 我不知道从这个cron的错误中我可以看到哪里。

此外,我看到我的命令似乎在syslog中被截断(它停在goaccess --log-format='[

由于

1 个答案:

答案 0 :(得分:1)

手头的问题是您要执行的命令包含%字符。根据crontab手册,%被认为是命令的结束,%之后的所有内容都是命令的标准输入。如果您的命令需要%,例如printfdate的常规格式字符串,则需要转义%

  

<强> man 5 crontab

     

&#34;第六&#34; field(行的其余部分)指定要运行的命令。该行的整个命令部分,直到换行符或   a&#34; %&#34;字符,将由/bin/sh或由cronfile的SHELL变量中指定的shell执行。 A&#34; %&#34;除非使用反斜杠(\)进行转义,否则命令中的字符将更改为换行符,并且第一个%之后的所有数据将作为标准输入发送到命令。

所以如果你有一个类型的命令:

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

和crontab读取:

# .---------------- 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

文件~/foo将包含内容hello world~/bar将包含hello universe(而不是hello \universe)。