<?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');
> require_once($CFG->libdir . '/clilib.php');
< // now get cli options
< list($options, $unrecognized) = cli_get_params(
< array(
> // Now get cli option.
> [$options, $unrecognized] = cli_get_params(
> [
'help' => false,
'stop' => false,
< ),
< array(
> 'list' => false,
> 'force' => false,
> 'enable' => false,
> 'disable' => false,
> 'disable-wait' => false,
> 'keep-alive' => null,
> ],
> [
'h' => 'help',
's' => 'stop',
< )
> 'l' => 'list',
> 'f' => 'force',
> 'e' => 'enable',
> 'd' => 'disable',
> 'w' => 'disable-wait',
> 'k' => 'keep-alive',
> ]
);
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)
> -k, --keep-alive=N Keep this script alive for N seconds and poll for new tasks
echo $help;
> The default value can be set by administrators in:
die;
> Site administration > Server > Tasks > Task processing > Keep alive time
}
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);
> }
>
< cron_run();
>
> $keepalive = $options['keep-alive'];
> \core\cron::run_main_process($keepalive);