我在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)但不起作用。当从命令行执行该命令时,该命令的工作方式就像一个符咒。我不知道我能从这个白痴的错误中看到什么。
此外,我发现我的命令在syslog中似乎被截断了(它在goaccess --log-format='[处停止)
谢谢
发布于 2018-01-29 11:51:24
当前的问题是,希望执行的命令包含%字符。根据crontab手册,%被认为是命令的结尾,%之后的所有内容都是命令的标准输入。如果命令需要% (如printf或date的通用格式字符串),则需要转义%。
man 5 crontab“第六个”字段(行的其余部分)指定要运行的命令。行的整个命令部分,直到换行符或"%“字符,将由/bin/sh或cronfile的SHELL变量中指定的shell执行。命令中的"%“字符(除非用反斜杠(\)转义)将被更改为换行符,第一个%之后的所有数据将作为标准输入发送到该命令。
因此,如果您有一个类型的命令:
#!/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)。
https://stackoverflow.com/questions/48500478
复制相似问题