Docker环境下Laravel Schedule触发命令后Job未执行,手动运行命令正常
问题排查方案&解决方案
核心原因优先级从高到低排列:
- 配置缓存导致env函数失效
如果你在容器部署流程中执行了php artisan config:cache生成配置缓存,Laravel会屏蔽所有env()函数的调用,直接返回null。你的调度逻辑用env("AMBIENTE")做判断,此时条件完全不触发,命令自然不会被执行。
修复方法:- 在
config/app.php中添加自定义配置项:'ambiente' => env('AMBIENTE', 1) - 将Kernel中的判断逻辑替换为
if (config('app.ambiente') == "2")和if (config('app.ambiente') == "1") - 重新执行
php artisan config:cache生成新的缓存
- 在
- cron运行上下文环境变量缺失
crontab进程运行时不会加载交互式shell的环境变量配置(如.bashrc、.profile内的变量),如果你的AMBIENTE变量是配置在shell用户的个人配置文件中,而非Docker容器全局环境变量或.env文件,cron触发时无法读取到正确的变量值,导致调度条件不生效。
验证方法:在Kernel的schedule方法最开头添加日志打印:\Log::info('调度器触发,当前AMBIENTE值:' . env('AMBIENTE')),触发调度后查看Laravel日志确认变量值是否符合预期。 - 运行用户权限差异
手动执行命令的用户和crontab所属用户不一致时,会出现权限不足导致的静默失败:比如cron所属用户没有权限向队列推送任务、没有权限读取.env文件、没有权限执行命令逻辑等。
验证方法:执行crontab -l确认所属用户后,切换到该用户执行/usr/local/bin/php /var/www/artisan consultar_a1,观察运行结果是否和你之前手动执行的结果一致。 - 命令执行无日志导致无法定位问题
你当前仅记录了cron本身的运行日志,没有记录schedule调度命令的执行输出,无法确认命令是否真的被触发、执行过程有没有报错。
修复方法:给调度命令追加输出配置,示例:
触发调度后查看该日志即可获取命令的执行详情、报错信息。$schedule->command('consultar_a1')->dailyAt('12:23')->appendOutputTo('/var/log/consultar_a1_schedule.log'); - 队列驱动配置不一致
你的命令是派发Job到队列执行,如果cron运行时读取到的队列驱动和手动执行时不一致(比如cron上下文读取到null驱动,Job直接被丢弃),supervisor自然不会有相关执行日志。你可以在命令的handle方法开头添加日志,确认命令本身是否被执行到。
内容的提问来源于stack exchange,提问作者Felipe Colussi-oliva
相关产品推荐
相关产品推荐

