...] Arguments: job-classes Optional job class list to only run those jobs Providing a class will ignore the time-sensitivity restriction Options: -h, --help Display this help message -v, --verbose Output more information' . PHP_EOL; exit(0); } if (Util::needUpgrade()) { Server::get(LoggerInterface::class)->debug('Update required, skipping cron', ['app' => 'cron']); exit; } $config = Server::get(IConfig::class); if ($config->getSystemValueBool('maintenance', false)) { Server::get(LoggerInterface::class)->debug('We are in maintenance mode, skipping cron', ['app' => 'cron']); exit; } // Don't do anything if Nextcloud has not been installed if (!$config->getSystemValueBool('installed', false)) { exit(0); } // load all apps to get all api routes properly setup Server::get(IAppManager::class)->loadApps(); Server::get(ISession::class)->close(); $verbose = isset($argv[1]) && ($argv[1] === '-v' || $argv[1] === '--verbose'); // initialize a dummy memory session $session = new \OC\Session\Memory(); $cryptoWrapper = \OC::$server->getSessionCryptoWrapper(); $session = $cryptoWrapper->wrapSession($session); \OC::$server->setSession($session); $logger = Server::get(LoggerInterface::class); $appConfig = Server::get(IAppConfig::class); $tempManager = Server::get(ITempManager::class); $tempManager->cleanOld(); // Exit if background jobs are disabled! $appMode = $appConfig->getValueString('core', 'backgroundjobs_mode', 'ajax'); if ($appMode === 'none') { if (OC::$CLI) { echo 'Background Jobs are disabled!' . PHP_EOL; } else { OC_JSON::error(['data' => ['message' => 'Background jobs disabled!']]); } exit(1); } if (OC::$CLI) { // set to run indefinitely if needed if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) { @set_time_limit(0); } // the cron job must be executed with the right user if (!function_exists('posix_getuid')) { echo 'The posix extensions are required - see https://www.php.net/manual/en/book.posix.php' . PHP_EOL; exit(1); } $user = posix_getuid(); $configUser = fileowner(OC::$configDir . 'config.php'); if ($user !== $configUser) { echo 'Console has to be executed with the user that owns the file config/config.php' . PHP_EOL; echo 'Current user id: ' . $user . PHP_EOL; echo 'Owner id of config.php: ' . $configUser . PHP_EOL; exit(1); } // We call Nextcloud from the CLI (aka cron) if ($appMode !== 'cron') { $appConfig->setValueString('core', 'backgroundjobs_mode', 'cron'); } // a specific job class list can optionally be given as argument $jobClasses = array_slice($argv, $verbose ? 2 : 1); $jobClasses = empty($jobClasses) ? null : $jobClasses; // Low-load hours $onlyTimeSensitive = false; $startHour = $config->getSystemValueInt('maintenance_window_start', 100); if ($jobClasses === null && $startHour <= 23) { $date = new \DateTime('now', new \DateTimeZone('UTC')); $currentHour = (int)$date->format('G'); $endHour = $startHour + 4; if ($startHour <= 20) { // Start time: 01:00 // End time: 05:00 // Only run sensitive tasks when it's before the start or after the end $onlyTimeSensitive = $currentHour < $startHour || $currentHour > $endHour; } else { // Start time: 23:00 // End time: 03:00 $endHour -= 24; // Correct the end time from 27:00 to 03:00 // Only run sensitive tasks when it's after the end and before the start $onlyTimeSensitive = $currentHour > $endHour && $currentHour < $startHour; } } // Work $jobList = Server::get(IJobList::class); // We only ask for jobs for 14 minutes, because after 5 minutes the next // system cron task should spawn and we want to have at most three // cron jobs running in parallel. $endTime
MIT No Attribution Copyright <YEARr> <COPYRIGHT HOLDER>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.