日志反复出现Could not acquire lock for cron job,任务长期不执行。锁本身是在防止同一Job并发,先确认持锁进程是否真的还活着。

定位与修复记录

1. 固定复现范围

从日志取得job_code和时间,查询cron_schedule最近记录。状态running且executed_at很早,才可能是遗留任务;短任务偶发抢锁通常只是另一个实例正在执行。

2. 确认真实原因

在所有Cron节点检查bin/magento cron:run进程、系统crontab与Supervisor。多台机器都跑default组而又使用不同锁后端,会互相看不见。

3. 执行修复

确认env.php锁提供者和缓存/数据库连接一致。先停止重复调度源,再处理确认已死亡的running记录;不要在活进程存在时改状态。

4. 恢复后处理

对耗时任务加业务级分页和超时监控,让单次在计划间隔内完成。必须并行时拆成不同job code或队列消息,而不是关闭锁。

SELECT schedule_id,job_code,status,scheduled_at,executed_at,finished_at,messages FROM cron_schedule WHERE job_code='vendor_job' ORDER BY schedule_id DESC LIMIT 20;
ps -eo pid,lstart,etime,cmd | grep '[b]in/magento cron:run'
crontab -l
bin/magento cron:run --group default

验收清单

  • 连续观察至少三个调度周期,每次只有一个running并能转success;无重复业务记录,下一周期可正常获取锁。
  • 若任务涉及订单或库存,清遗留状态前先确认没有仍在执行的数据库事务。