Laravel 7生产环境定时队列任务重复执行问题求助
Laravel 7定时任务Dispatch的Job重复执行排查方案
检查Crontab重复配置
有可能多个用户的crontab都配置了schedule:run,导致调度命令每分钟被重复触发:- 执行
crontab -l查看当前用户(通常是root)的定时任务 - 切换到www-data用户查看:
su www-data -c 'crontab -l' - 同时检查
/etc/cron.d/目录下是否存在额外的Laravel定时任务配置文件
- 执行
验证Supervisor队列进程数量
尽管配置中numprocs=1,但可能存在残留进程导致多个worker同时运行:- 查看当前队列进程:
ps aux | grep queue:listen - 如果发现多个进程,先停止Supervisor:
sudo supervisorctl stop all - 杀掉所有队列相关进程:
sudo pkill -f queue:listen - 重启Supervisor:
sudo supervisorctl start all
- 查看当前队列进程:
排查定时命令是否被重复触发
在CreateStatement命令的handle方法中添加日志,确认命令本身是否被执行多次:public function handle() { Log::info("create:statement command triggered at " . now()->toDateTimeString()); dispatch(new JobsCreateStatement()); }查看Laravel日志,如果同一小时内出现多条该日志,说明调度命令被重复触发,回到第一步排查Crontab。
检查队列驱动与重试配置
- 如果使用database队列,查看
jobs表是否存在重复插入的任务记录 - 在
JobsCreateStatement类中临时关闭重试,排除重试机制导致的重复执行:public $tries = 1;
- 如果使用database队列,查看
禁止定时任务重叠执行
给定时调度添加withoutOverlapping(),避免前一次命令未完成就触发新的执行:protected function schedule(Schedule $schedule) { //...... 其他命令 $schedule->command('create:statement')->hourly()->withoutOverlapping(); }
内容的提问来源于stack exchange,提问作者Zia
相关产品推荐
相关产品推荐

