【问题标题】:Laravel 5: Job schedule without overlapLaravel 5:没有重叠的工作计划
【发布时间】:2016-05-04 16:08:47
【问题描述】:

我正在尝试每分钟安排一次 laravel 作业,没有重叠,遵循文档:http://laravel.com/docs/5.0/artisan

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

当我尝试对其进行修改以使其永远不会重叠时:$schedule->call('Cron::myjob')->name('job-name')->withoutOverlapping(); 它会触发一次并且永远不会再次触发。

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

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

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

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

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

    【讨论】:

    • 我永远不会想到 storage/framework 目录中一个随机未删除的文件导致我的工作无法运行。干杯!
    • @ahaurat 实际上很容易弄清楚。只需查看供应商代码。参考this
    猜你喜欢
    • 2015-07-01
    • 2017-02-09
    • 2018-07-05
    • 2014-04-14
    • 1970-01-01
    • 2017-06-27
    • 2016-11-23
    • 2016-04-20
    • 2015-10-30
    相关资源
    最近更新 更多