【问题标题】:Cronjobs do not execute although present in syslog尽管 syslog 中存在,但 Cronjobs 不执行
【发布时间】:2018-01-29 22:36:27
【问题描述】:

我在根 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='[ 处停止)

谢谢


【问题讨论】:

    标签: unix cron


    【解决方案1】:

    目前的问题是您希望执行的命令包含% 字符。根据 crontab 手册,% 被认为是命令的结尾,% 之后的所有内容都是命令的标准输入。如果您的命令需要%,例如printfdate 的一般格式字符串,则需要对% 进行转义。

    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)。

    【讨论】:

    • 谢谢,我的命令行现在在系统日志中是正确的。可悲的是,当直接在 CLI 中执行时,我的命令似乎并没有在正确的地方执行。
    • @kzrdt cronrestricted environment 中运行您的命令很可能您必须调整您的PATH 或写下zcatgoaccess 的完整路径为@987654347 @ 和 /other/path/to/goaccess。尽管如此,我还是建议将您的行复制到 2 个脚本中并从 cron 执行脚本。
    • 它在 bash 脚本中完美运行。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多