From 127d28b1904870f6f7c5e9b18e41d61a6da63d1b Mon Sep 17 00:00:00 2001 From: Elmar Ludwig Date: Thu, 23 Nov 2023 15:14:51 +0100 Subject: cronjobs: only lock the currently executing schedule, re #987 --- lib/classes/CronjobScheduler.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/classes/CronjobScheduler.php b/lib/classes/CronjobScheduler.php index fbb5b66..2397a9d 100644 --- a/lib/classes/CronjobScheduler.php +++ b/lib/classes/CronjobScheduler.php @@ -239,13 +239,6 @@ class CronjobScheduler return; } - $lock = new FileLock('studip-cronjob'); - - // Check whether a previous cronjob worker is still running. - if (!$lock->tryLock()) { - return; - } - // Find all schedules that are due to execute and which task is active $temp = CronjobSchedule::findBySQL('`active` = 1 AND `next_execution` <= UNIX_TIMESTAMP() ' .'ORDER BY `next_execution`'); @@ -264,6 +257,13 @@ class CronjobScheduler $log->duration = -1; try { + $lock = new FileLock("cronjob-{$schedule->schedule_id}"); + + // Check whether a previous cronjob worker is still running. + if (!$lock->tryLock()) { + continue; + } + // Skip schedules with missing task classes if (!$schedule->task->valid) { throw new Exception(_('Die Klasse für den Cronjob-Task konnte nicht gefunden werden')); @@ -306,11 +306,11 @@ class CronjobScheduler URLHelper::setBaseURL($old); $this->sendMailToRoots($subject, $message); + } finally { + // Release lock + $lock->release(); } } - - // Release lock - $lock->release(); } /** -- cgit v1.0