crontab不执行常见原因
1,先排查你要执行的脚本是否正常运行,验证方法就是在控制台输入你要执行的脚本命令,看是否能执行,但是即使有时能正常执行,也不一定说脚本就没问题。今天我就遇到了一个很奇怪的现象,我的脚本命令没使用全路径,在控制台是可以正常运行,但是crontab就是没执行起来,日志也没报错。然后把命令换成全路径之后,cron就成功执行了。所以说,为了能正常运行,脚本命令我建议写上全路径。
比如我要执行一个爬虫,脚本一般这样写
#!/bin/bash
cd /var/xxx/project #你的爬虫目录
scrapy crawl myspider #执行scrapy
这样写,然后在控制台直接执行是没问题的
sh /xxx/xxx/xx.sh
但是换成cron来就不行了,我们把scrapy的路径给补上,输入命令
find / -name scrapy
快速找到你的scrapy在哪里,把xx/bin/scrapy那个路径复制过来,我的是/usr/local/bin/scrapy,然后把刚才的脚本改成
/usr/local/bin/scrapy crawl myspider
如果还不成功,那就开始下一步去crontab上找问题了。
2,首先我们把cron日志打开,Ubuntu系统默认是不打开cron日志的,不信你cd 到/var/log目录下是找不到cron.log文件的。
如何打开,很简单,控制台输入
vi /etc/rsyslog.d/50-default.conf
打开文件,在文件中找到cron.*,把前面的#去掉,保存退出,输入
sudo service rsyslog restart
重启系统日志,然后稍微等下应该就能在/var/log目录下看到cron.log,vi cron.log就可以查看cron运行日志了。
如果在日志中能看到有这样的记录
Jan 23 12:55:01 iZbp12o440hd7llqz14ebpZ CRON[3990]: (root) MAIL (mailed 1 byte of output; but got status 0x00ff, #012)
这是一个很常见的错误,很多新手都会碰到这个问题,这个错误原因是cron执行完你的命令后就会给你发一封邮件,但是我邮件都没配置往哪发啊,所以就报错了。难道真的要我把邮箱配置起来嘛,当然不要,也不知道怎么配,更不想去配,你执行完就完事了呗,给我发邮件干啥呢。可能老外比较喜欢用邮件,想每天登录邮箱都能看到满满的一箱信,哈哈,扯远了。
回归正题,我们只需要在每条cron命令空一格后加上这几个字
>/dev/null 2>&1
比如我的一条命令
*/5 * * * * sh /var/xxx/xxx.sh >/dev/null 2>&1
明确告诉你,完事别给我发什么邮件了,老子不需要。然后
service cron restart
把cron重启一下,静静的等待奇迹的出现。。。
如果还有问题,看日志,一步步排查,还有一个很值得注意的就是要确保你的脚本命令尽量使用全路径,有些环境变量没配的话是执行不起来的。
---------------------
作者:panyox