首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5:没有重叠的工作计划

Laravel 5:没有重叠的工作计划
EN

Stack Overflow用户
提问于 2015-06-01 14:34:16
回答 1查看 6.7K关注 0票数 7

我正试图每分钟安排一次拉拉作业,没有重叠,按照docs:http://laravel.com/docs/5.0/artisan

当我运行$schedule->call('Cron::myjob');时,它工作得很好,并且每分钟都会开火,

当我试图修改它,使它不会重叠:$schedule->call('Cron::myjob')->name('job-name')->withoutOverlapping();,它一次又一次地触发。

我做错了什么?我的命令是使用“返回”将操作发送回作业,因此它应该知道操作已经完成。

编辑:我发现了这个问题。这似乎是我第一次运行命令时,我没有“返回”操作,因此它再也没有运行命令。我选择了一个新的作业名,并再次运行命令,一切都正常。

EN

回答 1

Stack Overflow用户

发布于 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分钟,我认为这一次出了问题,应该允许该命令再次运行。

它也远非完美,因为它与它试图保护的命令是分开的,因此很容易忘记,如果命令被重命名,或者整个应用程序被移到某个地方。它也不能防止互斥文件未被删除的情况,因为命令实际上正在运行,只是出了问题,而且比通常花费更多的时间。在这种情况下,将允许重叠,一切都可能爆炸。但它解决了我的问题,至少现在是这样。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30576261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档