16

我尝试在 Laravel 5 上运行计划。当我运行它时它工作正常:

$schedule->call(function() {
   // do something here..
})->everyMinute();

但是当我添加时withoutOverlapping(),调度程序永远不会运行任务:

$schedule->call(function () {
   // do something here..
})->everyMinute()->name('job_name')->withoutOverlapping();

*这些计划代码写在 /app/Console/Kernel.php

4

4 回答 4

28

顺序很重要,但从未被提及。

尝试这个

$schedule->call(function () {
   // do something here..
})->name('job_name')->withoutOverlapping()->everyMinute();

这就是它对我的工作方式:

(1) call -> (2) name -> (3) withoutOverlapping -> (4) dailyAt -> (5) onOneServer

当您弄乱订单时,您可能会遇到错误,例如

需要预定事件名称以防止重叠。使用name'withoutOverlapping'之前的方法。

或者

调用未定义的方法 Illuminate\Console\Scheduling\Schedule::name()

于 2018-11-09T02:38:39.307 回答
16

->everyMinute()使用时删除->withoutOverlapping()仍然会每分钟运行一次,但不会重叠。

更新

从 Laravel v. 5.5+ 开始,您可以指定在“无重叠”锁过期之前必须经过多少分钟。

例如。->withoutOverlapping(10)10分钟后可用于解锁“重叠”。

于 2015-11-06T09:20:47.160 回答
3

withoutOverlapping 方法在执行命令时创建互斥文件,并在执行完成时删除互斥文件。

调度程序检查它不允许再次执行的任何命令是否存在互斥文件。

在您的情况下,互斥锁文件不会被删除,它会阻止命令再次运行。

您可以使用 php artisan cache:clear 清除 laravel 缓存以使其再次工作

于 2019-09-20T04:45:13.913 回答
1

没有重叠()的 cron 现在正在工作。让我们了解它是如何工作的例如:

$schedule->command('command')
                    ->hourly()
                    ->withoutOverlapping();

withoutOverlapping 表示当 cron 运行时,它将在 storage/framework/ 目录中生成一个锁定文件,一旦完成,它将删除锁定文件。现在下次开始,它将检查锁定文件是否存在。如果存在锁定文件,则表示前一个 cron 未完成,并且不允许该 cron 与前一个重叠。

In this scenario, the lock file is there into the storage/framework/ directory so that the cron is not working

锁定文件看起来像: schedule-random_string 例如:schedule-0bfdb7f0bc14b27d84c7d6f2a2528e85b0847fc6

修复:删除或重命名锁定文件 (storage/framework/schedule-0bfdb7f0bc14b27d84c7d6f2a2528e85b0847fc6)

于 2020-10-01T07:49:30.987 回答