代码之家  ›  专栏  ›  技术社区  ›  kzrdt

Cronjobs虽然存在于syslog中,但不执行

  •  0
  • kzrdt  · 技术社区  · 7 年前

    我在根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 回复  |  直到 7 年前
        1
  •  1
  •   kvantour    7 年前

    目前的问题是,您希望执行的命令包含 % 性格根据crontab手册 % 被认为是命令的结束 % 是命令的标准输入。如果您的命令需要 % 例如字符串的一般格式 printf date ,您需要逃离 % .

    man 5 crontab

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

    因此,如果您有以下类型的命令:

    #!/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 ).