我正在与一个不起作用的 cronjob 作斗争。每次执行它时都会收到一封错误邮件,内容是
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
我的 crontab 是这个:
# Delete logfile from last week
00 21 * * * rm /var/log/dumping_$(date -d @$(( $(date "+%s") + 86400 )) "+%u").log
我尝试了几种选择,例如
00 21 * * * 'rm /var/log/dumping_$(date -d @$(( $(date "+%s") + 86400 )) "+%u").log'
00 21 * * * /bin/bash -c 'rm /var/log/dumping_$(date -d @$(( $(date "+%s") + 86400 )) "+%u").log'
它们都不能像 cronjob 那样工作。当然,当我直接在命令行中输入它时,它是有效的。正确的语法是什么?
答案1
%
在 cronjobs 中具有特殊含义 - 这意味着之后的文本为标准输入到它之前的命令。要使用文字百分号,请尝试 \escaping 它或将所有内容移到外部脚本并调用那来自 crontab。
(恕我直言,当它嵌套 $(…) 超过两次时,这是一个明确的信号,它应该被提取到脚本中。)
请注意,您也可以使用date -d tomorrow +%u
它而不是手动计算。
答案2
主要区别在于,当您手动运行 shell 时,它很可能是 bash,而 cron 默认为 sh。我不能肯定地说这是问题的根源,但考虑到您的命令行有些复杂(例如,大量特殊字符在不同的 shell 和解释器之间可能会或可能不会以不同的方式解释),您可能从将命令rm
及其所有参数粘贴到脚本中并从 cron 调用脚本中受益。至少这是我首先要尝试的事情。