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 重启一下,静静的等待奇迹的出现。。。
如果还有问题,看日志,一步步排查,还有一个很值得注意的就是要确保你的脚本命令尽量使用全路径,有些环境变量没配的话是执行不起来的。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于