前一阵子碰到了个玄学问题,就是 crontab 不执行 shell 脚本。 在命令行下可以正常执行,然而 crontab 下不行,incron 更不行。 折腾了一天,总算找到了解决方法
解决方法
脚本务必放在 root 文件夹下
个人的经验把,放在 root 文件夹下,也就是用户目录下,crontab 或则 incron 才能方便执行
设置脚本的环境变量,在脚本前插入 PATH
这个比较重要,在命令行下执行:
echo $PATH
将返回的环境变量复制出来,插入到前面,如下
PATH=/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/home/x/bin
给脚本执行权限,提取
chmod a+x shell.sh
chmod 777 shell.sh
chmod +x shell.sh
其他
查找执行文件的真正路径
有时候
hexo g
是不能直接执行的 可以试试
which hexo
查找一下 hexo 运行文件的真正路径。
脚本调试
如果你不清楚脚本哪儿错误了 这样记录错误信息到 log 文件中 crontab 可以这样:
*/1 * * * *cd /root/ && ./runhexo.sh >> /root/runhexoerror.log 2>&1
其中 /root/runhexoerror.log
便是日志文件了,你可以查看返回的错误信息,根据错误信息调试你的脚本。
什么是#!/bin/sh
#!/bin/sh
是指定脚本解释器 比如我用
#!/usr/bin/php
就是用 php 模块执行 php 文件
总结
上面几点看上去简单,实际上,他们花去我很多的时间。我查了很多的资料才注意到这些。 所以说,基础一定要扎实,我也不是专业写脚本的,所以碰到这些问题。