Laravel CRON任务在AWS Ubuntu环境中无法正常运行
解决Laravel调度任务提示“No scheduled commands are ready to run”的问题
我之前部署Laravel定时任务时也碰到过一模一样的问题——手动跑命令完全正常,但调度就是不触发,咱们一步步来排查解决:
1. 优先排查时区不一致问题
这是最常见的坑!Laravel应用时区和服务器系统时区不匹配,会导致你设置的10:00和服务器实际时间对不上,调度自然认为没到执行时间:
- 检查Laravel的
.env文件,确认APP_TIMEZONE设置正确(比如国内常用Asia/Shanghai) - 运行服务器命令
date,查看系统当前时间,和你预期的10点是否一致 - 如果不一致,要么修改
.env里的时区,要么调整服务器时区:Ubuntu下可以执行sudo dpkg-reconfigure tzdata来设置正确时区
2. 检查Crontab的执行用户与PHP路径
- 执行用户问题:如果用root用户添加的crontab,但Laravel项目文件权限是www-data用户的,可能会导致调度无法正常读取任务配置。建议切换到www-data用户添加定时任务:
然后把你的调度命令粘贴进去。sudo -u www-data crontab -e - PHP路径问题:系统默认的
php命令可能和你手动执行时用的不是同一个版本/路径。先运行which php获取正确的PHP CLI路径,比如输出是/usr/bin/php,然后把crontab里的命令改成:* * * * * /usr/bin/php /var/www/html/app/artisan schedule:run >> /dev/null 2>&1
3. 开启调度日志排查细节
先不要把输出丢到/dev/null,改成输出到日志文件,方便查看具体错误:
* * * * * php /var/www/html/app/artisan schedule:run >> /var/www/html/app/storage/logs/schedule.log 2>&1
然后查看日志文件storage/logs/schedule.log,里面会有更详细的执行信息,比如是否加载到任务、有没有权限问题等。
另外,手动运行php artisan schedule:list,可以列出所有已配置的调度任务,确认你的email:reminder任务是否在列表里,以及显示的执行时间是否符合预期。
4. 临时去掉--force参数测试
虽然手动运行带--force没问题,但有时候调度环境下这个参数可能会有隐性冲突。先把Kernel.php里的任务改成:
$schedule->command('email:reminder')->dailyAt('10:00');
然后重新测试调度是否正常执行。
内容的提问来源于stack exchange,提问作者Mr Robot
相关产品推荐
相关产品推荐

