/bin/rm:以 cronjob 形式运行命令时,选项无效 -- '^M'

/bin/rm:以 cronjob 形式运行命令时,选项无效 -- '^M'

我每小时运行此命令来清理文件:

# 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

相关内容