我在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='[
)
由于
答案 0 :(得分:1)
手头的问题是您要执行的命令包含%
字符。根据crontab手册,%
被认为是命令的结束,%
之后的所有内容都是命令的标准输入。如果您的命令需要%
,例如printf
或date
的常规格式字符串,则需要转义%
。
<强>
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
)。