/bin/rm: 无效选项 -- '^M' 作为 cronjob 运行命令时

Hyn*_*rix 4 cron

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

# crontab -l
MAILTO=notify@localhost
0 */1 * * * find /var/www/tmp/ -name "*" -mmin +60 | /usr/bin/xargs /bin/rm -f -R
Run Code Online (Sandbox Code Playgroud)

但是每次执行 cronjob 时,都会向我的邮件帐户发送一封包含此错误消息的电子邮件:

/bin/rm: invalid option -- '^M'
Run Code Online (Sandbox Code Playgroud)

手动执行命令工作正常:

find /var/www/tmp/ -name "*" -mmin +60 | /usr/bin/xargs /bin/rm -f -R
# ok
Run Code Online (Sandbox Code Playgroud)

日志显示:

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)
Run Code Online (Sandbox Code Playgroud)

所以显然问题出在cron文件中。

问候,

the*_*ey1 15

听起来您的 crontab 文件中的行尾可能有一个回车(^M有时由非回车友好程序输出)。您可以通过以下方式确认:

cat -v /var/spool/cron/crontabs/{user}
Run Code Online (Sandbox Code Playgroud)

请务必{user}使用您的用户名替换。如果您^M在输出中看到,则文件中有回车符。可以使用类似的程序删除它们sed(请务必先备份文件):

sed -i 's/\r//' /var/spool/cron/crontabs/{user}'
Run Code Online (Sandbox Code Playgroud)

正如Monica 在 Lightness Races评论中提到的,dos2unix也是从文本文件中删除回车的好选择。

dos2unix 的默认设置是就地覆盖文件,因此在备份文件后

dos2unix /var/spool/cron/crontabs/{user}
Run Code Online (Sandbox Code Playgroud)

  • https://packages.ubuntu.com/search?keywords=dos2unix (5认同)

Hyn*_*rix 6

感谢 Sergiy Kolodyazhnyy 的提示,我发现所有 crontab 都以控制字符结尾。然后我清理并重新输入命令,现在它可以工作了:

crontab -l
crontab -e # enter commands here again
Run Code Online (Sandbox Code Playgroud)