Ubuntu中Laravel的定时任务不执行可能遇到的问题及解决方案
如果不想一步步排查,可以直接看第4步,说不定就是你要的答案
1.查看日志
首现出现这种问题,先查日志
Ubuntu系统默认cron日志是未开启的, 可以先到/var/log目录下是找一下cron.log文件,应该是没有的,如果已经打开,就直接查看日志,如果没开,就先打开日志。
vi /etc/rsyslog.d/50-default.conf
打开文件,在文件中找到cron.*,把前面的#去掉,保存退出,输入
sudo service rsyslog restart
重启系统日志,然后稍微等下应该就能在/var/log目录下看到cron.log,
tail -f cron.log
就可以查看cron运行日志了。我遇到类似以下的报错
(root) MAIL (mailed 1 byte of output; but got status 0x00ff, #012)
网上查阅,大概原因是cron执行完你的命令后就会给你发一封邮件,而我连邮件服务器或者相关配置都不知道在哪,也没配过,网上大多的解决方案就是在定时任务后添加:
>/dev/null 2>&1
但是我Laravel的配置本来就写了的
* * * * * cd /data/wwwroot/project && php artisan schedule:run >> /dev/null 2>&1
那我就纳闷了,难道我还有别的定时任务吗?
首选crontab -e查看的是当前登录用户的,我是root,那我再查一下www用户的
crontab -u www -l
然而并没有任何任务
2.另一个“不为我知”的定时任务
继续查资料,发现还有一个编辑定时任务的任务,在/etc目录下,进到etc下,果然还有个crontab,编辑下看看
vi /etc/crontab
如图,这好像系统自带的任务,上面注释自己看了,看到这几个任务后没有>/dev/null 2>&1,但查立相关任务,得到的只是系统任务,虽然确实是这几个任务导致的邮件通知,但实际经测试,虽然邮件通知是报错了,但并不影响其它定时任务,所以这里也不关闭,如果不放心可以先注释
3.定义任务命令测试
如果我在终端,直接输入命令
cd /data/wwwroot/project && php artisan schedule:run >> /dev/null 2>&1
在Laravel的日志中,自已打个日志,是看到任务执行了的,但为什么crontab不执行!
继续探索,再写一条简单定义任务加到crontab中
#crontab -e
加一条任务
* * * * * echo "Hello World" > /tmp/cron.txt 2>&1
再查看/tmp/cron.txt,里面是会被写入 Hello World 的
4.最后的尝试:php路径写成绝对路径
首先看一下PHP路径在哪
#whereis查找php
root@root:/tmp# whereis php
#结果如下
php: /usr/bin/php7.2 /usr/bin/php /usr/lib/php /etc/php /usr/local/php /usr/share/php7.2-readline /usr/share/php7.2-json /usr/share/php /usr/share/php7.2-opcache /usr/share/php7.2-common /usr/local/php/bin/php /usr/share/man/man1/php.1.gz
然后把定时任务里的php路径改一下
* * * * * cd /data/wwwroot/project && /usr/bin/php artisan schedule:run >> /dev/null 2>&1
其实前三个路径我在一开始就都试了一下,好像没啥用,突然我想起我的安装路径好像是是/usr/local/php下面
然后自己确认了一下,换成了
* * * * * cd /data/wwwroot/project && /usr/local/php/bin/php artisan schedule:run >> /dev/null 2>&1
保存,耐心等待!终于Laravel日志刷出来了!至于为什么这里要写绝对路径,而我在其它服务器上没有写绝对路径,暂时我也没找到问题,有待探索,暂时先这样。
最后的最后:关闭crontab日志
重新注释crontab日志开关
vi /etc/rsyslog.d/50-default.conf
sudo service rsyslog restart
到这就结束了,码农的日常生活...