From ad17190dc7a7477b7d2d6fd5bc4dd3242d9993bb Mon Sep 17 00:00:00 2001 From: Brendan Heywood Date: Wed, 16 Oct 2019 19:47:38 +1100 Subject: [PATCH] MDL-66925 cron: Add cli option to keep adhoc task runner alive --- admin/tool/task/cli/adhoc_task.php | 64 +++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/admin/tool/task/cli/adhoc_task.php b/admin/tool/task/cli/adhoc_task.php index f44f9d6483c..1bae3806e6d 100644 --- a/admin/tool/task/cli/adhoc_task.php +++ b/admin/tool/task/cli/adhoc_task.php @@ -32,10 +32,13 @@ list($options, $unrecognized) = cli_get_params( [ 'execute' => false, 'help' => false, + 'keep-alive' => 0, 'showsql' => false, 'showdebugging' => false, ], [ 'h' => 'help', + 'e' => 'execute', + 'k' => 'keep-alive', ] ); @@ -45,19 +48,20 @@ if ($unrecognized) { } if ($options['help'] or empty($options['execute'])) { - $help = -"Scheduled cron tasks. + $help = <<showcronsql)) { $DB->set_debug(true); @@ -93,25 +100,52 @@ if (!empty($CFG->showcrondebugging)) { } core_php_time_limit::raise(); -$starttime = microtime(); // Increase memory limit. raise_memory_limit(MEMORY_EXTRA); -// Emulate normal session - we use admin accoutn by default. +// Emulate normal session - we use admin account by default. cron_setup_user(); // Start output log. -$timenow = time(); +$timestart = time(); +$timenow = $timestart; +$finishtime = $timenow + (int)$options['keep-alive']; $humantimenow = date('r', $timenow); mtrace("Server Time: {$humantimenow}\n"); // Run all adhoc tasks. $taskcount = 0; -while (!\core\task\manager::static_caches_cleared_since($timenow) && - $task = \core\task\manager::get_next_adhoc_task($timenow)) { - cron_run_inner_adhoc_task($task); - $taskcount++; - unset($task); +$waiting = false; +while (!\core\task\manager::static_caches_cleared_since($timestart)) { + + $task = \core\task\manager::get_next_adhoc_task($timenow); + + if ($task) { + if ($waiting) { + cli_writeln(''); + } + $waiting = false; + cron_run_inner_adhoc_task($task); + $taskcount++; + unset($task); + } else { + if (time() > $finishtime) { + break; + } + if (!$waiting) { + cli_write('Waiting for more adhoc tasks to be queued '); + } else { + cli_write('.'); + } + $waiting = true; + sleep(1); + $timenow = time(); + } } +if ($waiting) { + cli_writeln(''); +} + mtrace("Ran {$taskcount} adhoc tasks found at {$humantimenow}"); +