![在为 cron 任务寻找匹配的 `"' 时出现意外的 EOF](https://linux22.com/image/1498520/%E5%9C%A8%E4%B8%BA%20cron%20%E4%BB%BB%E5%8A%A1%E5%AF%BB%E6%89%BE%E5%8C%B9%E9%85%8D%E7%9A%84%20%60%22'%20%E6%97%B6%E5%87%BA%E7%8E%B0%E6%84%8F%E5%A4%96%E7%9A%84%20EOF.png)
我正在与一个不起作用的 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 调用脚本中受益。至少这是我首先要尝试的事情。