我有一个Laravel调度作业,它在Kernel.php
中定义如下
$schedule->call('\App\Http\Controllers\ScheduleController@processQueuedMessages')
->everyFiveMinutes()
->name('process_queued_messages')
->withoutOverlapping();
在开发过程中,我的作业由于语法错误而引发了一个异常。我纠正了这个错误并尝试再次执行它;但由于某种原因它不会。
我尝试了artisan down
,然后是artisan up
。我还尝试重新启动服务器示例。但没有任何帮助。作业没有得到执行(也没有例外)。
我意识到问题是由于->withoutOverlapping()
。不知何故,Laravel调度程序认为作业已经在运行,因此不再执行它。
6条答案
按热度按时间v440hwme1#
我通过查看供应商代码找到了解决方案。
它在本地存储中创建一个名为
schedule-*
的文件。删除
storage/framework
处的文件schedule-*
解决了问题。xmd2e60i2#
**对于阅读本文的任何人来说,自己删除计划文件并不是正确的方法。**您需要指定锁定时间,根据该时间,withoutOverlapping可以防止更多任务运行。
如Laravel - Task Scheduling中所引用
如果需要,您可以指定在“无重叠”锁定过期之前必须经过的分钟数。默认情况下,锁定将在24小时后过期:
您的问题是由于withoutOverlapping应用了24小时的默认锁定。因此,您必须等待24小时才能接受类似的任务。只需根据您的需要调整锁定时间,方法是:
(10)在发送电子邮件时,不需要重叠;//其中10表示分钟
gwbalxhn3#
这对我来说很管用:
bqjvbblv4#
我也有这个问题。没有一个适当的解决方案,但变通方案将解决这个问题。
转到项目的storage/framework文件夹并删除所有
schedule-***********
文件。然后再次尝试运行cron。即使您使用
withoutOverlapping() function
,它也会运行。希望这对你有用。如果有任何疑问,请询问。
dluptydi5#
这周我们遇到了这种情况,我们认为我们找到了原因。我们的cron运行了生产服务器的一个站点文件夹。我们的部署过程涉及到第二个文件夹,我们在其中进行部署/构建,然后在最后进行热文件夹交换。()可能必须在进程完成时更新schedule-* 文件中的一行,该文件夹可能在作业中被交换,cron无法在正确的schedule-* 文件中成功地将作业标记为已完成,因此它认为该作业仍在运行/卡住。
这种情况很少发生,但我们将添加一个命令,在部署后清除这些文件,这样就不会再次发生这种情况。
thtygnil6#
从laravel 8.x开始,您可以使用specific command来清除互斥锁文件,例如,如果在执行任务时由于服务器重新启动而导致任务阻塞
clear:cache
的问题是,该命令清除整个应用程序的缓存,而该命令只清除互斥文件