'use strict';
|
|
const path = require('path');
|
const util = require('util');
|
const sleep = require('mz-modules/sleep');
|
const Command = require('../command');
|
const isWin = process.platform === 'win32';
|
const osRelated = {
|
titleTemplate: isWin ? '\\"title\\":\\"%s\\"' : '"title":"%s"',
|
appWorkerPath: isWin ? 'egg-cluster\\lib\\app_worker.js' : 'egg-cluster/lib/app_worker.js',
|
agentWorkerPath: isWin ? 'egg-cluster\\lib\\agent_worker.js' : 'egg-cluster/lib/agent_worker.js',
|
};
|
|
class StopCommand extends Command {
|
|
constructor(rawArgv) {
|
super(rawArgv);
|
this.usage = 'Usage: egg-scripts stop [--title=example]';
|
this.serverBin = path.join(__dirname, '../start-cluster');
|
this.options = {
|
title: {
|
description: 'process title description, use for kill grep',
|
type: 'string',
|
},
|
};
|
}
|
|
get description() {
|
return 'Stop server';
|
}
|
|
* run(context) {
|
const { argv } = context;
|
|
this.logger.info(`stopping egg application ${argv.title ? `with --title=${argv.title}` : ''}`);
|
|
// node /Users/tz/Workspaces/eggjs/egg-scripts/lib/start-cluster {"title":"egg-server","workers":4,"port":7001,"baseDir":"/Users/tz/Workspaces/eggjs/test/showcase","framework":"/Users/tz/Workspaces/eggjs/test/showcase/node_modules/egg"}
|
let processList = yield this.helper.findNodeProcess(item => {
|
const cmd = item.cmd;
|
return argv.title ?
|
cmd.includes('start-cluster') && cmd.includes(util.format(osRelated.titleTemplate, argv.title)) :
|
cmd.includes('start-cluster');
|
});
|
let pids = processList.map(x => x.pid);
|
|
if (pids.length) {
|
this.logger.info('got master pid %j', pids);
|
this.helper.kill(pids);
|
// wait for 5s to confirm whether any worker process did not kill by master
|
yield sleep('5s');
|
} else {
|
this.logger.warn('can\'t detect any running egg process');
|
}
|
|
|
// node --debug-port=5856 /Users/tz/Workspaces/eggjs/test/showcase/node_modules/_egg-cluster@1.8.0@egg-cluster/lib/agent_worker.js {"framework":"/Users/tz/Workspaces/eggjs/test/showcase/node_modules/egg","baseDir":"/Users/tz/Workspaces/eggjs/test/showcase","port":7001,"workers":2,"plugins":null,"https":false,"key":"","cert":"","title":"egg-server","clusterPort":52406}
|
// node /Users/tz/Workspaces/eggjs/test/showcase/node_modules/_egg-cluster@1.8.0@egg-cluster/lib/app_worker.js {"framework":"/Users/tz/Workspaces/eggjs/test/showcase/node_modules/egg","baseDir":"/Users/tz/Workspaces/eggjs/test/showcase","port":7001,"workers":2,"plugins":null,"https":false,"key":"","cert":"","title":"egg-server","clusterPort":52406}
|
processList = yield this.helper.findNodeProcess(item => {
|
const cmd = item.cmd;
|
return argv.title ?
|
(cmd.includes(osRelated.appWorkerPath) || cmd.includes(osRelated.agentWorkerPath)) && cmd.includes(util.format(osRelated.titleTemplate, argv.title)) :
|
(cmd.includes(osRelated.appWorkerPath) || cmd.includes(osRelated.agentWorkerPath));
|
});
|
pids = processList.map(x => x.pid);
|
|
if (pids.length) {
|
this.logger.info('got worker/agent pids %j that is not killed by master', pids);
|
this.helper.kill(pids, 'SIGKILL');
|
}
|
|
this.logger.info('stopped');
|
}
|
}
|
|
module.exports = StopCommand;
|