我正试图每分钟安排一次拉拉作业,没有重叠,按照docs:http://laravel.com/docs/5.0/artisan
当我运行$schedule->call('Cron::myjob');时,它工作得很好,并且每分钟都会开火,
当我试图修改它,使它不会重叠:$schedule->call('Cron::myjob')->name('job-name')->withoutOverlapping();,它一次又一次地触发。
我做错了什么?我的命令是使用“返回”将操作发送回作业,因此它应该知道操作已经完成。
编辑:我发现了这个问题。这似乎是我第一次运行命令时,我没有“返回”操作,因此它再也没有运行命令。我选择了一个新的作业名,并再次运行命令,一切都正常。
发布于 2016-05-04 08:08:47
为了防止重叠,Laravel使用名为"schedule-xxxxxx"的文件,其中xxxxxx是不应该与自身重叠的命令的散列。文件被放置在storage/framework中。如果在执行命令时出错,则文件可能不会被删除,从而导致该命令无法再次运行。
OP所做的--重命名命令--是一个解决办法。一个更简单的方法是删除互斥文件:
rm storage/framework/schedule-*
但这两种方法都不是真正的解决方案,除非您100%确信从现在起命令将始终正确运行。否则,这个问题可能很快就会重演。
最后我把这样的东西放进了我的cron文件里:
find /var/www/storage/framework/ -name schedule-5b904de82f094302106f83418c5adb01 -mmin +20 | xargs -I{} rm {}
我希望命令只需不到一分钟就能运行。计划每5分钟运行一次。因此,如果它的互斥文件超过20分钟,我认为这一次出了问题,应该允许该命令再次运行。
它也远非完美,因为它与它试图保护的命令是分开的,因此很容易忘记,如果命令被重命名,或者整个应用程序被移到某个地方。它也不能防止互斥文件未被删除的情况,因为命令实际上正在运行,只是出了问题,而且比通常花费更多的时间。在这种情况下,将允许重叠,一切都可能爆炸。但它解决了我的问题,至少现在是这样。
https://stackoverflow.com/questions/30576261
复制相似问题