176 lines
5.5 KiB
PHP
176 lines
5.5 KiB
PHP
![]() |
<?php
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
// | CatchAdmin [Just Like ~ ]
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
// | Copyright (c) 2017~{$year} http://catchadmin.com All rights reserved.
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
// | Author: JaguarJack [ njphper@gmail.com ]
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
|
|||
|
declare (strict_types = 1);
|
|||
|
|
|||
|
namespace catchAdmin\monitor\command;
|
|||
|
|
|||
|
use catchAdmin\monitor\command\process\Master;
|
|||
|
use catchAdmin\monitor\command\process\Process;
|
|||
|
use catcher\facade\FileSystem;
|
|||
|
use think\console\Command;
|
|||
|
use think\console\Input;
|
|||
|
use think\console\input\Argument;
|
|||
|
use think\console\input\Option;
|
|||
|
use think\console\Output;
|
|||
|
use think\console\Table;
|
|||
|
|
|||
|
class CatchCrontabCommand extends Command
|
|||
|
{
|
|||
|
protected $pid;
|
|||
|
|
|||
|
protected function configure()
|
|||
|
{
|
|||
|
// 指令配置
|
|||
|
$this->setName('catch:crontab')
|
|||
|
->addArgument('action', Argument::OPTIONAL, '[start|reload|stop|restart]', 'start')
|
|||
|
->addOption('daemon', '-d', Option::VALUE_NONE, 'daemon mode')
|
|||
|
->addOption('pid', '-p', Option::VALUE_REQUIRED, 'you can send signal to the process of pid')
|
|||
|
->addOption('static', '-s', Option::VALUE_REQUIRED, 'default static process number', 1)
|
|||
|
->addOption('dynamic', '-dy', Option::VALUE_REQUIRED, 'default dynamic process number', 10)
|
|||
|
->addOption('interval', '-i', Option::VALUE_REQUIRED, 'interval/seconds', 60)
|
|||
|
->setDescription('start catch crontab schedule');
|
|||
|
}
|
|||
|
|
|||
|
protected function execute(Input $input, Output $output)
|
|||
|
{
|
|||
|
if (!$input->hasOption('pid')) {
|
|||
|
$this->pid = Master::getMasterPid();
|
|||
|
} else {
|
|||
|
$this->pid = $input->getOption('pid');
|
|||
|
}
|
|||
|
|
|||
|
if (!extension_loaded('pcntl') || !extension_loaded('posix')) {
|
|||
|
$output->error('you should install extension [pcntl && posix]');
|
|||
|
} else {
|
|||
|
$this->{$input->getArgument('action')}();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 进程启动
|
|||
|
*
|
|||
|
* @time 2020年09月14日
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
protected function start()
|
|||
|
{
|
|||
|
$worker = new Master();
|
|||
|
|
|||
|
$worker->staticNumber($this->input->getOption('static'))
|
|||
|
->dynamic($this->input->getOption('dynamic'))
|
|||
|
->interval($this->input->getOption('interval'))
|
|||
|
->asDaemon($this->input->hasOption('daemon'))
|
|||
|
->run();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 停止任务
|
|||
|
*
|
|||
|
* @time 2020年07月07日
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
protected function stop()
|
|||
|
{
|
|||
|
$retryTimes = 0;
|
|||
|
|
|||
|
if (Process::isAlive($this->pid)) {
|
|||
|
$this->output->info('🔨 catch crontab is running.');
|
|||
|
Process::kill($this->pid, SIGTERM);
|
|||
|
// 睡眠 1 秒
|
|||
|
$this->output->info('⌛️ killing catch crontab service, please waiting...');
|
|||
|
sleep(1);
|
|||
|
if (!Process::isAlive($this->pid)) {
|
|||
|
$this->output->info('🎉 catch crontab stopped!');
|
|||
|
} else {
|
|||
|
while (true) {
|
|||
|
Process::kill($this->pid, SIGKILL);
|
|||
|
if (Process::isAlive($this->pid)) {
|
|||
|
$retryTimes++;
|
|||
|
$this->output->info('🔥 retry $retryTimes times');
|
|||
|
usleep(500 * 1000);
|
|||
|
if ($retryTimes >= 3) {
|
|||
|
$this->output->info('💔 catch crontab is running, stop failed, please use [kill -9 {$this->pid}] to Stop it');
|
|||
|
break;
|
|||
|
}
|
|||
|
} else {
|
|||
|
$this->output->info('🎉 catch crontab stopped!');
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
Master::exitMasterDo();
|
|||
|
} else {
|
|||
|
$this->output->error('🤔️ catch crontab is not running, Please Check it!');
|
|||
|
}
|
|||
|
|
|||
|
$this->output->info('🎉 stop catch crontab successfully');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 重启任务
|
|||
|
*
|
|||
|
* @time 2020年07月07日
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
protected function reload()
|
|||
|
{
|
|||
|
Process::kill($this->pid, SIGUSR1);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 重启
|
|||
|
*
|
|||
|
* @time 2020年07月07日
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
protected function restart()
|
|||
|
{
|
|||
|
$this->stop();
|
|||
|
|
|||
|
$this->output->info('catch crontab restarting...');
|
|||
|
|
|||
|
usleep(500 * 1000);
|
|||
|
|
|||
|
$this->start();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* status
|
|||
|
*
|
|||
|
* @time 2020年07月22日
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
protected function status()
|
|||
|
{
|
|||
|
if ($this->pid) {
|
|||
|
if (Process::isAlive($this->pid)) {
|
|||
|
Process::kill($this->pid, SIGUSR2);
|
|||
|
|
|||
|
usleep(100000);
|
|||
|
|
|||
|
$worker = new Master;
|
|||
|
$table = new Table;
|
|||
|
|
|||
|
$table->setHeader(['PID', '名称', '内存', '处理任务', '开始时间', '运行时间', '状态'], Table::ALIGN_CENTER);
|
|||
|
|
|||
|
$table->setRows($worker->getWorkerStatus(), Table::ALIGN_CENTER);
|
|||
|
|
|||
|
$this->output->info($table->render());
|
|||
|
} else {
|
|||
|
$this->output->error('🤔️ catch crontab is not running, Please Check it!');
|
|||
|
}
|
|||
|
} else {
|
|||
|
$this->output->error('🤔️ catch crontab is not running, Please Check it!');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|