Laravel 5:没有重叠的工作时间表

时间:2015-06-01 14:34:17

标签: laravel laravel-5

我正在尝试按照文档每分钟安排一个没有重叠的laravel作业:http://laravel.com/docs/5.0/artisan

当我运行$schedule->call('Cron::myjob');时,它运行良好,每分钟都会触发,

当我尝试修改它时它永远不会重叠:$schedule->call('Cron::myjob')->name('job-name')->withoutOverlapping();它会触发一次而不再重复。

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

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

1 个答案:

答案 0 :(得分:6)

为了防止重叠,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分钟,我认为这次出现了问题,应该允许该命令再次运行。

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

相关问题