stop.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. 'use strict';
  2. const path = require('path');
  3. const util = require('util');
  4. const sleep = require('mz-modules/sleep');
  5. const Command = require('../command');
  6. const isWin = process.platform === 'win32';
  7. const osRelated = {
  8. titleTemplate: isWin ? '\\"title\\":\\"%s\\"' : '"title":"%s"',
  9. appWorkerPath: isWin ? 'egg-cluster\\lib\\app_worker.js' : 'egg-cluster/lib/app_worker.js',
  10. agentWorkerPath: isWin ? 'egg-cluster\\lib\\agent_worker.js' : 'egg-cluster/lib/agent_worker.js',
  11. };
  12. class StopCommand extends Command {
  13. constructor(rawArgv) {
  14. super(rawArgv);
  15. this.usage = 'Usage: egg-scripts stop [--title=example]';
  16. this.serverBin = path.join(__dirname, '../start-cluster');
  17. this.options = {
  18. title: {
  19. description: 'process title description, use for kill grep',
  20. type: 'string',
  21. },
  22. };
  23. }
  24. get description() {
  25. return 'Stop server';
  26. }
  27. * run(context) {
  28. const { argv } = context;
  29. this.logger.info(`stopping egg application ${argv.title ? `with --title=${argv.title}` : ''}`);
  30. // 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"}
  31. let processList = yield this.helper.findNodeProcess(item => {
  32. const cmd = item.cmd;
  33. return argv.title ?
  34. cmd.includes('start-cluster') && cmd.includes(util.format(osRelated.titleTemplate, argv.title)) :
  35. cmd.includes('start-cluster');
  36. });
  37. let pids = processList.map(x => x.pid);
  38. if (pids.length) {
  39. this.logger.info('got master pid %j', pids);
  40. this.helper.kill(pids);
  41. // wait for 5s to confirm whether any worker process did not kill by master
  42. yield sleep(argv.timeout || '5s');
  43. } else {
  44. this.logger.warn('can\'t detect any running egg process');
  45. }
  46. // 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}
  47. // 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}
  48. processList = yield this.helper.findNodeProcess(item => {
  49. const cmd = item.cmd;
  50. return argv.title ?
  51. (cmd.includes(osRelated.appWorkerPath) || cmd.includes(osRelated.agentWorkerPath)) && cmd.includes(util.format(osRelated.titleTemplate, argv.title)) :
  52. (cmd.includes(osRelated.appWorkerPath) || cmd.includes(osRelated.agentWorkerPath));
  53. });
  54. pids = processList.map(x => x.pid);
  55. if (pids.length) {
  56. this.logger.info('got worker/agent pids %j that is not killed by master', pids);
  57. this.helper.kill(pids, 'SIGKILL');
  58. }
  59. this.logger.info('stopped');
  60. }
  61. }
  62. module.exports = StopCommand;