![/bin/rm:以 cronjob 形式运行命令时,选项无效 -- '^M'](https://linux22.com/image/919193/%2Fbin%2Frm%EF%BC%9A%E4%BB%A5%20cronjob%20%E5%BD%A2%E5%BC%8F%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%E6%97%B6%EF%BC%8C%E9%80%89%E9%A1%B9%E6%97%A0%E6%95%88%20--%20'%5EM'.png)
我每小时运行此命令来清理文件:
# crontab -l
MAILTO=notify@localhost
0 */1 * * * find /var/www/tmp/ -name "*" -mmin +60 | /usr/bin/xargs /bin/rm -f -R
但每次执行 cronjob 时,都会向我的邮件帐户发送一封包含此错误消息的电子邮件:
/bin/rm: invalid option -- '^M'
手动执行命令可以正常工作:
find /var/www/tmp/ -name "*" -mmin +60 | /usr/bin/xargs /bin/rm -f -R
# ok
日志显示:
grep CRON /var/log/syslog
Dec 23 06:34:01 Ubuntu-1804-bionic-64-minimal CRON[29314]: (root) CMD (find /var/www/tmp/ -name "*" -mmin +60 | /usr/bin/xargs /bin/rm -f -R --^M)
因此显然问题出在 cron 文件中。
问候,
答案1
听起来你的 crontab 文件中的行尾可能有一个回车符(^M
有时由不支持回车符的程序输出)。你可以通过以下方式确认这一点:
cat -v /var/spool/cron/crontabs/{user}
请务必用{user}
您的用户名替换。如果您^M
在输出中看到,则文件中有回车符。可以使用类似sed
(请务必先备份文件):
sed -i 's/\r//' /var/spool/cron/crontabs/{user}'
正如在来自 Monica 的 Lightness Races 的评论,dos2unix也是从文本文件中删除回车符的一个不错的选择。
dos2unix 默认是就地覆盖文件,因此备份文件后:
dos2unix /var/spool/cron/crontabs/{user}
答案2
感谢 Sergiy Kolodyazhnyy 的提示,我发现所有 crontab 都以控制字符结尾。然后我清理并重新输入命令,现在它可以正常工作了:
crontab -l
crontab -e # enter commands here again