From 176b5202e0f367d467c7c4f1706418407e08c50a Mon Sep 17 00:00:00 2001 From: Brendan Heywood Date: Wed, 31 Jul 2019 18:07:39 +1000 Subject: [PATCH] MDL-59594 cli: Introduce cli helpers for graceful exits \core\local\cli\shutdown::script_supports_graceful_exit(); Sets up interception of exit signals and keep the script running. \core\local\cli\shutdown::should_gracefully_exit(); Use this to check whether you should exit, often inside a long running loop. --- lang/en/admin.php | 2 + lib/classes/local/cli/shutdown.php | 81 ++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 lib/classes/local/cli/shutdown.php diff --git a/lang/en/admin.php b/lang/en/admin.php index d78836a471b..ef9c31979df 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -120,6 +120,8 @@ $string['cfgwwwrootwarning'] = '$CFG->wwwroot is defined incorrectly in the conf $string['cleanup'] = 'Cleanup'; $string['clianswerno'] = 'n'; $string['cliansweryes'] = 'y'; +$string['cliexitgraceful'] = 'Exiting gracefully, please wait ...'; +$string['cliexitnow'] = 'Exiting right NOW'; $string['cliincorrectvalueerror'] = 'Error, incorrect value "{$a->value}" for "{$a->option}"'; $string['cliincorrectvalueretry'] = 'Incorrect value, please retry'; $string['clistatusdisabled'] = 'Status: disabled'; diff --git a/lib/classes/local/cli/shutdown.php b/lib/classes/local/cli/shutdown.php new file mode 100644 index 00000000000..93f295cfd11 --- /dev/null +++ b/lib/classes/local/cli/shutdown.php @@ -0,0 +1,81 @@ +. + +/** + * CLI script shutdown helper class. + * + * @package core + * @copyright 2019 Brendan Heywood + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\local\cli; + +defined('MOODLE_INTERNAL') || die(); + +/** + * CLI script shutdown helper class. + * + * @package core + * @copyright 2019 Brendan Heywood + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class shutdown { + + /** @var bool Should we exit gracefully at the next opportunity? */ + protected static $cligracefulexit = false; + + /** + * Declares that this CLI script can gracefully handle signals + * + * @return void + */ + public static function script_supports_graceful_exit(): void { + \core_shutdown_manager::register_signal_handler('\core\local\cli\shutdown::signal_handler'); + } + + /** + * Should we gracefully exit? + * + * @return bool true if we should gracefully exit + */ + public static function should_gracefully_exit(): bool { + return self::$cligracefulexit; + } + + /** + * Handle the signal + * + * The first signal flags a graceful exit. If a second signal is received + * then it immediately exits. + * + * @param int $signo The signal number + * @return bool true if we should exit + */ + public static function signal_handler(int $signo): bool { + + if (self::$cligracefulexit) { + cli_heading(get_string('cliexitnow', 'admin')); + return true; + } + + cli_heading(get_string('cliexitgraceful', 'admin')); + self::$cligracefulexit = true; + return false; + } + +} +