Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
/admin/cli/ -> cron.php (source)
<?php

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * CLI cron
 *
 * This script looks through all the module directories for cron.php files
 * and runs them.  These files can contain cleanup functions, email functions
 * or anything that needs to be run on a regular basis.
 *
 * @package    core
 * @subpackage cli
 * @copyright  2009 Petr Skoda (http://skodak.org)
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

define('CLI_SCRIPT', true);

require(__DIR__.'/../../config.php');
require_once($CFG->libdir.'/clilib.php');      // cli only functions
require_once($CFG->libdir.'/cronlib.php');

// now get cli options
list($options, $unrecognized) = cli_get_params(
< array(
> [
'help' => false, 'stop' => false,
< ), < array(
> 'list' => false, > 'force' => false, > 'enable' => false, > 'disable' => false, > 'disable-wait' => false, > ], [
'h' => 'help', 's' => 'stop',
< )
> 'l' => 'list', > 'f' => 'force', > 'e' => 'enable', > 'd' => 'disable', > 'w' => 'disable-wait', > ]
); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { $help = "Execute periodic cron actions. Options: -h, --help Print out this help -s, --stop Notify all other running cron processes to stop after the current task
> -l, --list Show the list of currently running tasks and how long they have been running > -f, --force Execute task even if cron is disabled Example: > -e, --enable Enable cron \$sudo -u www-data /usr/bin/php admin/cli/cron.php > -d, --disable Disable cron "; > -w, --disable-wait=600 Disable cron and wait until all tasks finished or fail after N seconds (optional param)
echo $help; die; } if ($options['stop']) { // By clearing the caches this signals to other running processes // to exit after finishing the current task. \core\task\manager::clear_static_caches(); die;
> } } > > if ($options['enable']) { \core\local\cli\shutdown::script_supports_graceful_exit(); > set_config('cron_enabled', 1); > mtrace('Cron has been enabled for the site.'); cron_run(); > exit(0); > } > > if ($options['disable']) { > set_config('cron_enabled', 0); > \core\task\manager::clear_static_caches(); > mtrace('Cron has been disabled for the site.'); > exit(0); > } > > if ($options['list']) { > $tasks = \core\task\manager::get_running_tasks(); > mtrace('The list of currently running tasks:'); > $format = "%7s %-12s %-9s %-20s %-52s\n"; > printf ($format, > 'PID', > 'HOST', > 'TYPE', > 'TIME', > 'CLASSNAME' > ); > foreach ($tasks as $task) { > printf ($format, > $task->pid, > substr($task->hostname, 0, 12), > $task->type, > format_time(time() - $task->timestarted), > substr($task->classname, 0, 52) > ); > } > exit(0); > } > > if ($wait = $options['disable-wait']) { > $started = time(); > if (true === $wait) { > // Default waiting time. > $waitsec = 600; > } else { > $waitsec = $wait; > $wait = true; > } > > set_config('cron_enabled', 0); > \core\task\manager::clear_static_caches(); > mtrace('Cron has been disabled for the site.'); > mtrace('Allocating '. format_time($waitsec) . ' for the tasks to finish.'); > > $lastcount = 0; > while ($wait) { > $tasks = \core\task\manager::get_running_tasks(); > > if (count($tasks) == 0) { > mtrace(''); > mtrace('All scheduled and adhoc tasks finished.'); > exit(0); > } > > if (time() - $started >= $waitsec) { > mtrace(''); > mtrace('Wait time ('. format_time($waitsec) . ') elapsed, but ' . count($tasks) . ' task(s) still running.'); > mtrace('Exiting with code 1.'); > exit(1); > } > > if (count($tasks) !== $lastcount) { > mtrace(''); > mtrace(count($tasks) . " tasks currently running.", ''); > $lastcount = count($tasks); > } else { > mtrace('.', ''); > } > > sleep(1); > } > } > > if (!get_config('core', 'cron_enabled') && !$options['force']) { > mtrace('Cron is disabled. Use --force to override.'); > exit(1);