From 409d769eb7f944838031ce0e3a86d4bcafb3e1c7 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 27 Jul 2026 16:41:21 -0400 Subject: [PATCH] Scope the cron lock per install so instances don't block each other Report an unopenable cron lock file instead of claiming cron is running --- cron/cron.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cron/cron.php b/cron/cron.php index e1942c5c..604d4dba 100644 --- a/cron/cron.php +++ b/cron/cron.php @@ -9,10 +9,15 @@ if (php_sapi_name() !== 'cli') { } // Only one run at a time. Autopay charges cards, so an overlapping run (the previous -// run still going when the next one fires) could bill the same invoice twice. The -// handle is held for the life of the process and released when it exits. -$cron_lock_handle = fopen(sys_get_temp_dir() . '/itflow_cron.lock', 'c'); -if ($cron_lock_handle === false || !flock($cron_lock_handle, LOCK_EX | LOCK_NB)) { +// run still going when the next one fires) could bill the same invoice twice. The lock +// file is named per install so separate ITFlow instances on one host don't block each +// other, and the handle is held for the life of the process, released when it exits. +$cron_lock_file = sys_get_temp_dir() . '/itflow_cron_' . md5(__DIR__) . '.lock'; +$cron_lock_handle = fopen($cron_lock_file, 'c'); +if ($cron_lock_handle === false) { + die("Cannot open the cron lock file at $cron_lock_file - check permissions and open_basedir.\n"); +} +if (!flock($cron_lock_handle, LOCK_EX | LOCK_NB)) { die("Cron is already running - exiting.\n"); }