在为 cron 任务寻找匹配的 `"' 时出现意外的 EOF

在为 cron 任务寻找匹配的 `"' 时出现意外的 EOF

我正在与一个不起作用的 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 调用脚本中受益。至少这是我首先要尝试的事情。

相关内容