Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.
/admin/cli/ -> cron.php (source)

Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402] [Versions 400 and 402] [Versions 401 and 402]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * CLI cron
  19   *
  20   * This script looks through all the module directories for cron.php files
  21   * and runs them.  These files can contain cleanup functions, email functions
  22   * or anything that needs to be run on a regular basis.
  23   *
  24   * @package    core
  25   * @subpackage cli
  26   * @copyright  2009 Petr Skoda (http://skodak.org)
  27   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  28   */
  29  
  30  define('CLI_SCRIPT', true);
  31  
  32  require(__DIR__ . '/../../config.php');
  33  require_once($CFG->libdir . '/clilib.php');
  34  
  35  // Now get cli option.
  36  [$options, $unrecognized] = cli_get_params(
  37      [
  38          'help' => false,
  39          'stop' => false,
  40          'list' => false,
  41          'force' => false,
  42          'enable' => false,
  43          'disable' => false,
  44          'disable-wait' => false,
  45          'keep-alive' => null,
  46      ],
  47      [
  48          'h' => 'help',
  49          's' => 'stop',
  50          'l' => 'list',
  51          'f' => 'force',
  52          'e' => 'enable',
  53          'd' => 'disable',
  54          'w' => 'disable-wait',
  55          'k' => 'keep-alive',
  56      ]
  57  );
  58  
  59  if ($unrecognized) {
  60      $unrecognized = implode("\n  ", $unrecognized);
  61      cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
  62  }
  63  
  64  if ($options['help']) {
  65      $help =
  66      "Execute periodic cron actions.
  67  
  68  Options:
  69  -h, --help               Print out this help
  70  -s, --stop               Notify all other running cron processes to stop after the current task
  71  -l, --list               Show the list of currently running tasks and how long they have been running
  72  -f, --force              Execute task even if cron is disabled
  73  -e, --enable             Enable cron
  74  -d, --disable            Disable cron
  75  -w, --disable-wait=600   Disable cron and wait until all tasks finished or fail after N seconds (optional param)
  76  -k, --keep-alive=N       Keep this script alive for N seconds and poll for new tasks
  77                           The default value can be set by administrators in:
  78                           Site administration > Server > Tasks > Task processing > Keep alive time
  79  
  80  Example:
  81  \$sudo -u www-data /usr/bin/php admin/cli/cron.php
  82  ";
  83  
  84      echo $help;
  85      die;
  86  }
  87  
  88  if ($options['stop']) {
  89      // By clearing the caches this signals to other running processes
  90      // to exit after finishing the current task.
  91      \core\task\manager::clear_static_caches();
  92      die;
  93  }
  94  
  95  if ($options['enable']) {
  96      set_config('cron_enabled', 1);
  97      mtrace('Cron has been enabled for the site.');
  98      exit(0);
  99  }
 100  
 101  if ($options['disable']) {
 102      set_config('cron_enabled', 0);
 103      \core\task\manager::clear_static_caches();
 104      mtrace('Cron has been disabled for the site.');
 105      exit(0);
 106  }
 107  
 108  if ($options['list']) {
 109      $tasks = \core\task\manager::get_running_tasks();
 110      mtrace('The list of currently running tasks:');
 111      $format = "%7s %-12s %-9s %-20s %-52s\n";
 112      printf(
 113          $format,
 114          'PID',
 115          'HOST',
 116          'TYPE',
 117          'TIME',
 118          'CLASSNAME'
 119      );
 120      foreach ($tasks as $task) {
 121          printf(
 122              $format,
 123              $task->pid,
 124              substr($task->hostname, 0, 12),
 125              $task->type,
 126              format_time(time() - $task->timestarted),
 127              substr($task->classname, 0, 52)
 128          );
 129      }
 130      exit(0);
 131  }
 132  
 133  if ($wait = $options['disable-wait']) {
 134      $started = time();
 135      if (true === $wait) {
 136          // Default waiting time.
 137          $waitsec = 600;
 138      } else {
 139          $waitsec = $wait;
 140          $wait = true;
 141      }
 142  
 143      set_config('cron_enabled', 0);
 144      \core\task\manager::clear_static_caches();
 145      mtrace('Cron has been disabled for the site.');
 146      mtrace('Allocating ' . format_time($waitsec) . ' for the tasks to finish.');
 147  
 148      $lastcount = 0;
 149      while ($wait) {
 150          $tasks = \core\task\manager::get_running_tasks();
 151  
 152          if (count($tasks) == 0) {
 153              mtrace('');
 154              mtrace('All scheduled and adhoc tasks finished.');
 155              exit(0);
 156          }
 157  
 158          if (time() - $started >= $waitsec) {
 159              mtrace('');
 160              mtrace('Wait time (' . format_time($waitsec) . ') elapsed, but ' . count($tasks) . ' task(s) still running.');
 161              mtrace('Exiting with code 1.');
 162              exit(1);
 163          }
 164  
 165          if (count($tasks) !== $lastcount) {
 166              mtrace('');
 167              mtrace(count($tasks) . " tasks currently running.", '');
 168              $lastcount = count($tasks);
 169          } else {
 170              mtrace('.', '');
 171          }
 172  
 173          sleep(1);
 174      }
 175  }
 176  
 177  if (!get_config('core', 'cron_enabled') && !$options['force']) {
 178      mtrace('Cron is disabled. Use --force to override.');
 179      exit(1);
 180  }
 181  
 182  \core\local\cli\shutdown::script_supports_graceful_exit();
 183  
 184  
 185  $keepalive = $options['keep-alive'];
 186  \core\cron::run_main_process($keepalive);