我正在尝试设置一个 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
还存在许多问题:
您在 Windows 计算机上创建了罚款并将其复制到服务器。除非您有“文本传输”模式,否则每行都会留下 CR/LF 结尾。按照其他人的建议,运行
dos2unix
该文件来修复此问题。删除 #! 中的前导空格线,正如其他人已经建议的那样。
不要写入 /var/log/cron.log。这是一个系统日志文件,您不应该写入它。
不要用于
chmod -R 777
使单个文件可执行。相反,使用chmod 755
或者甚至更好chmod a+x
。还有人指出,当你使用
crontab -e
系统时知道你是谁,所以crontab
格式中一定不能包含用户名。而不是
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 点运行该作业。
我认为你想要的是:
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 文件。