【问题标题】:Cron fails on single apostropheCron 在单个撇号上失败
【发布时间】:2010-12-01 22:44:17
【问题描述】:

以下内容按预期工作:

日期 +'%d-%b-%Y-%H-%M'

28-Sep-2009-14-28

但是 crontab 中的以下 4 个条目都不起作用。

* * * * * 日期 +\'%d-%b-%Y-%H-%M\' >> /backup/shantanu/testing.txt * * * * * 日期+'%d-%b-%Y-%H-%M' >> /backup/shantanu/testing1.txt * * * * * 日期 +"%d-%b-%Y-%H-%M" >> /backup/shantanu/testing2.txt * * * * * 日期 +\"%d-%b-%Y-%H-%M\" >> /backup/shantanu/testing3.txt 错误: /bin/sh: -c: 第 0 行:在寻找匹配的 `"' 时出现意外的 EOF /bin/sh: -c: 第 1 行:语法错误:文件意外结束

我可以将相同的代码保存在 shell 脚本中并设置 cron,但我想知道是否可以直接为任务设置 cron。

我尝试设置的实际 cron 条目看起来像这样......

16 * * * * mysqldump myDB myTB > /backup/ABCbc$(date +'%d-%b-%Y-%H-%M').sql 2> /backup/ABCbc_errORS$(date +' %d-%b-%Y-%H-%M').txt

【问题讨论】:

  • 如果您解决了问题,请将其作为答案发布。
  • 58 13 * * * /usr/bin/mysqldump -uroot -pPassWord --compact --databases db1 db2 db3 db4 | zip > /home/develop/backup/central_mydt$(date +'\%d\%m\%y').zip

标签: unix cron


【解决方案1】:

与直接键入交互式 shell 的命令相比,cron 作业命令的行为不同的常见原因有四个:

  • Cron 提供了有限的环境,例如,最小的 $PATH,并且缺少其他预期变量。
  • 默认情况下,Cron 调用 /bin/sh,而您可能正在交互使用其他一些 shell。
  • Cron 对% 字符进行特殊处理(在命令中将其转换为换行符)。
  • 该命令的行为可能有所不同,因为它没有可用的终端。

在 crontab 文件中,您必须在所有 % 字符前面加上 \,这告诉 cron 在命令中只放一个 %,例如

16 * * * * mysqldump myDB myTB > "/backup/ABCbc$(date +'\%d-\%b-\%Y-\%H-\%M').sql" 2> "/backup/ABCbc_errORS $(日期+'\%d-\%b-\%Y-\%H-\%M').txt"

(作为一个单独的问题,始终在 "$variable_substitution""$(command substitution)" 周围加上双引号,除非您知道为什么在特定情况下不这样做。否则,如果变量内容或命令输出包含空格或 @987654329 @,它们将被 shell 解释。)

【讨论】:

    【解决方案2】:

    您正在使用 /bin/sh 不支持的语法。尝试调用您喜欢的 shell 并将命令作为参数传递。

    【讨论】:

      【解决方案3】:

      只要作为日期参数提供的格式字符串中没有空格,就根本不需要刻度。

      date +%d-%b-%Y-%H-%M
      

      应该可以。

      【讨论】:

      • 我删除了上面提到的引号,但它仍然无法从 cron 中工作。它从命令行运行良好。
      猜你喜欢
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 2016-09-27
      • 2013-01-16
      相关资源
      最近更新 更多