diff --git a/src/ZM/Command/Server/ServerStopCommand.php b/src/ZM/Command/Server/ServerStopCommand.php index 91a447c6..8fc48459 100644 --- a/src/ZM/Command/Server/ServerStopCommand.php +++ b/src/ZM/Command/Server/ServerStopCommand.php @@ -5,8 +5,10 @@ namespace ZM\Command\Server; use Swoole\Process; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use ZM\Command\Daemon\DaemonCommand; +use ZM\Framework; use ZM\Utils\DataProvider; class ServerStopCommand extends DaemonCommand @@ -15,18 +17,38 @@ class ServerStopCommand extends DaemonCommand protected function configure() { $this->setDescription("停止运行的框架"); + $this->setDefinition([ + new InputOption('force', 'f', InputOption::VALUE_NONE, '强制停止'), + ]); } protected function execute(InputInterface $input, OutputInterface $output): int { - parent::execute($input, $output); + if ($input->getOption('force') !== false) { + $file_path = _zm_pid_dir(); + $list = DataProvider::scanDirFiles($file_path, false, true); + foreach($list as $file) { + $name = explode('.', $file); + if (end($name) == 'pid') { + $pid = file_get_contents($file_path.'/'.$file); + Process::kill($pid, SIGKILL); + } elseif ($file === 'master.json') { + $json = json_decode(file_get_contents($file_path.'/'.$file), true); + Process::kill($json['pid'], SIGKILL); + } + unlink($file_path.'/'.$file); + } + } else { + parent::execute($input, $output); + } Process::kill(intval($this->daemon_file["pid"]), SIGTERM); $i = 10; - while (file_exists(DataProvider::getWorkingDir() . "/.daemon_pid") && $i > 0) { + while (Framework::getProcessState(ZM_PROCESS_MASTER) !== false && $i > 0) { sleep(1); --$i; } if ($i === 0) { $output->writeln("停止失败,请检查进程pid #" . $this->daemon_file["pid"] . " 是否响应!"); + $output->writeln("或者可以尝试使用参数 --force 来强行杀死所有进程"); } else { $output->writeln("成功停止!"); }