add KILLER PROMPT function

This commit is contained in:
crazywhalecc
2022-03-13 22:05:23 +08:00
parent 4702b6ee75
commit 7ab4e88359

View File

@@ -16,6 +16,7 @@ use ZM\Console\Console;
*/
class SignalListener
{
private static $manager_kill_time = 0;
/**
* 监听Master进程的Ctrl+C
* @param Server $server
@@ -29,6 +30,7 @@ class SignalListener
} else {
echo "\r";
Console::warning("Server interrupted(SIGINT) on Master.");
Console::warning("Server will be shutdown.");
Process::kill($server->master_pid, SIGTERM);
}
});
@@ -48,6 +50,7 @@ class SignalListener
} else {
Console::verbose("Interrupted in manager!");
}
self::processKillerPrompt();
};
Console::debug("Listening Manager SIGINT");
if (version_compare(SWOOLE_VERSION, "4.6.7") >= 0) {
@@ -65,15 +68,40 @@ class SignalListener
public static function signalWorker(Server $server, $worker_id) {
Console::debug("Listening Worker #".$worker_id." SIGINT");
Process::signal(SIGINT, function () use ($worker_id, $server) {
if ($server->master_pid == $server->worker_pid) {
if ($server->master_pid == $server->worker_pid) { // 当Swoole以单进程模型运行的时候Worker需要监听杀死的信号
echo "\r";
Console::warning("Server interrupted(SIGINT) on Worker.");
swoole_timer_after(2, function() {
Process::kill(posix_getpid(), SIGTERM);
});
self::processKillerPrompt();
}
//Console::verbose("Interrupted in worker");
// do nothing
});
}
/**
* 按5次Ctrl+C后强行杀死框架的处理函数
*/
private static function processKillerPrompt() {
if (self::$manager_kill_time > 0) {
if (self::$manager_kill_time >= 5) {
$file_path = _zm_pid_dir();
$flist = DataProvider::scanDirFiles($file_path, false, true);
foreach($flist as $file) {
$name = explode('.', $file);
if (end($name) == 'pid' && $name[0] !== 'manager') {
$pid = file_get_contents($file_path.'/'.$file);
Process::kill($pid, SIGKILL);
}
unlink($file_path.'/'.$file);
}
} else {
echo "\r";
Console::log("再按" . (5 - self::$manager_kill_time) . "次Ctrl+C所有Worker进程就会被强制杀死", 'red');
}
}
self::$manager_kill_time++;
}
}