diff options
Diffstat (limited to 'cron.php')
-rw-r--r-- | cron.php | 73 |
1 files changed, 29 insertions, 44 deletions
@@ -27,29 +27,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -// Unfortunately we need this class for shutdown function -class TemporaryCronClass { - public static $sent = false; - public static $lockfile = ""; - public static $keeplock = false; -} - -// We use this function to handle (unexpected) shutdowns -function handleUnexpectedShutdown() { - // Delete lockfile - if (!TemporaryCronClass::$keeplock && file_exists(TemporaryCronClass::$lockfile)) { - unlink(TemporaryCronClass::$lockfile); - } - - // Say goodbye if the app did not shutdown properly - if (!TemporaryCronClass::$sent) { - if (OC::$CLI) { - echo 'Unexpected error!' . PHP_EOL; - } else { - OC_JSON::error(array('data' => array('message' => 'Unexpected error!'))); - } - } -} try { @@ -75,15 +52,11 @@ try { exit(0); } - // Handle unexpected errors - register_shutdown_function('handleUnexpectedShutdown'); - \OC::$server->getTempManager()->cleanOld(); // Exit if background jobs are disabled! - $appmode = OC_BackgroundJob::getExecutionType(); - if ($appmode == 'none') { - TemporaryCronClass::$sent = true; + $appMode = OC_BackgroundJob::getExecutionType(); + if ($appMode == 'none') { if (OC::$CLI) { echo 'Background Jobs are disabled!' . PHP_EOL; } else { @@ -93,35 +66,49 @@ try { } if (OC::$CLI) { - // Create lock file first - TemporaryCronClass::$lockfile = OC_Config::getValue("datadirectory", OC::$SERVERROOT . '/data') . '/cron.lock'; + $config = OC::$server->getConfig(); + $instanceId = $config->getSystemValue('instanceid'); + $lockFileName = 'owncloud-server-' . $instanceId . '-cron.lock'; + $lockDirectory = $config->getSystemValue('cron.lockfile.location', sys_get_temp_dir()); + $lockDirectory = rtrim($lockDirectory, '\\/'); + $lockFile = $lockDirectory . '/' . $lockFileName; + + if (!file_exists($lockFile)) { + touch($lockFile); + } // We call ownCloud from the CLI (aka cron) - if ($appmode != 'cron') { - // Use cron in future! + if ($appMode != 'cron') { OC_BackgroundJob::setExecutionType('cron'); } - // check if backgroundjobs is still running - if (file_exists(TemporaryCronClass::$lockfile)) { - TemporaryCronClass::$keeplock = true; - TemporaryCronClass::$sent = true; + // open the file and try to lock if. If it is not locked, the background + // job can be executed, otherwise another instance is already running + $fp = fopen($lockFile, 'w'); + $isLocked = flock($fp, LOCK_EX|LOCK_NB, $wouldBlock); + + // check if backgroundjobs is still running. The wouldBlock check is + // needed on systems with advisory locking, see + // http://php.net/manual/en/function.flock.php#45464 + if (!$isLocked || $wouldBlock) { echo "Another instance of cron.php is still running!" . PHP_EOL; exit(1); } - // Create a lock file - touch(TemporaryCronClass::$lockfile); - // Work $jobList = \OC::$server->getJobList(); $jobs = $jobList->getAll(); foreach ($jobs as $job) { $job->execute($jobList, $logger); } + + // unlock the file + flock($fp, LOCK_UN); + fclose($fp); + } else { // We call cron.php from some website - if ($appmode == 'cron') { + if ($appMode == 'cron') { // Cron is cron :-P OC_JSON::error(array('data' => array('message' => 'Backgroundjobs are using system cron!'))); } else { @@ -136,11 +123,9 @@ try { } } - // done! - TemporaryCronClass::$sent = true; // Log the successful cron execution if (\OC::$server->getConfig()->getSystemValue('cron_log', true)) { - \OC::$server->getAppConfig()->setValue('core', 'lastcron', time()); + \OC::$server->getConfig()->setAppValue('core', 'lastcron', time()); } exit(); |