CronTab 无法在 Ubuntu 中进行图像压缩作业:“/bin/bash^M:错误的解释器:没有这样的文件或目录”

CronTab 无法在 Ubuntu 中进行图像压缩作业:“/bin/bash^M:错误的解释器:没有这样的文件或目录”

我正在尝试设置一个 cronjob 来执行以下脚本。该脚本的功能是在WordPress目录中查找并压缩png和jpg文件。

    #!/bin/bash
echo `date` >> /root/optipng.log
find /home/ghost/wp-content/uploads -mtime -2 -iname '*.png' -print0 | \
 xargs -0 optipng -o7 -log /root/optipng.log -preserve
echo `date` >> /root/jpegoptim.log
find /home/ghost/wp-content/uploads  -mtime -2 -iname '*.jpg' -print0 | \
 xargs -0 jpegoptim --max=90 --preserve --totals >> /root/jpegoptim.log

所以我创建了一个文件“优化.sh“在 /usr/local 目录中并运行”crontab -e”并添加了以下命令:

00 10 * * *  root  /usr/local/optimize.sh

这应该在每天 10:00 运行图像优化,但在这种情况下不起作用,我什至尝试通过将上述命令修改为以下方式来创建日志文件:

00 10 * * *  root  /usr/local/optimize.sh &>/var/log/cron.log

日志文件为空并且 cron 作业未运行。我确实尝试了 Stack Overflow 中提到的其他方法,但似乎都不起作用。我还列出了一些我寻求帮助的其他教程:

https://askubuntu.com/questions/28995/setup-cron-weekly-backup

http://seravo.fi/2013/tips-to-optimize-images-for-faster-loading-websites

有人可以指出错误在哪里吗? :)

PS-我给文件 /usr/local/optimize.sh 授予了 700 权限,我尝试通过 ssh 直接运行该文件,但它返回以下错误:

/bin/bash^M: bad interpreter: No such file or directory

下面是使用 Nano 编辑器编写命令的确切方式的图片: 脚本中没有空格。

这个问题与 Stack Overflow 中的其他问题不同,例如为什么这个 crontab 作业没有运行从某种意义上说,错误不是由于 cron 文件的编写方式,而是文件 optimization.sh 中存在一些隐藏的空格。

答案1

还存在许多问题:

  1. 您在 Windows 计算机上创建了罚款并将其复制到服务器。除非您有“文本传输”模式,否则每行都会留下 CR/LF 结尾。按照其他人的建议,运行dos2unix该文件来修复此问题。

  2. 删除 #! 中的前导空格线,正如其他人已经建议的那样。

  3. 不要写入 /var/log/cron.log。这是一个系统日志文件,您不应该写入它。

  4. 不要用于chmod -R 777使单个文件可执行。相反,使用chmod 755或者甚至更好chmod a+x

  5. 还有人指出,当你使用crontab -e系统时知道你是谁,所以crontab格式中一定不能包含用户名。

  6. 而不是echo `date`简单地考虑date

答案2

更新(来自我们的聊天):

您的问题在开头显示空格,#!/bin/bash请确保不存在。另外,如果您进行了任何从 Windows 到 Linux 的复制,请尝试运行以下命令,删除任何^M字符并再次尝试运行脚本:

    sed -i s/{ctrl+v}{ctrl+m}// /usr/local/optimize.sh

或者如果你已经dos2unix运行:

    dos2unix /usr/local/optimize.sh



您每周五上午 10 点运行该作业。

sh 命令将在每个月的周五上午 10:00 执行。

我认为你想要的是:

00 10 * * *  /usr/local/optimize.sh > /var/log/cron.log 2>&1

答案3

您的 cron 行格式错误。这是一个例子:

0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

即不要命名用户,只有在将行添加到 /etc/crontab 时才将用户名放入,但如果您正在使用,crontab -e则将添加到当前用户的 crontab 文件。

相关内容