egg-scripts stop 缺失title参数情况可复
egg-scripts stop 缺失title参数情况可复现仓库。
隐患/Bug之误杀其他进程egg-scripts stop 缺失title参数情况下,会停掉本机所有eggjs(严格讲是start-cluster,如果pm2启动一个入口js则不会)启动的服务。
最小可复现仓库仓库地址
start多个服务分别启动service1和service2
$ cd service1 $ npm i $ npm run start $ cd ../service2 $ npm i $ npm run start stop任一服务
停掉service1或service2中的一个:
$ npm run stop
然后2个服务都停了。
原因egg-scripts stop
停止服务的过程是通过
ps -eo pid,args
列出大概如下进程信息:
23756 /usr/local/bin/node /Users/mac/Desktop/www/github/egg-scripts--title/service1/node_modules/egg-cluster/lib/agent_worker.js {"framework":"/Users/mac/Desktop/www/github/egg-scripts--title/service1/node_modules/egg","baseDir":"/Users/mac/Desktop/www/github/egg-scripts--title/service1","workers":4,"plugins":null,"https":false,"title":"egg-server-service1","clusterPort":62486}
23757 /usr/local/bin/node /Users/mac/Desktop/www/github/egg-scripts--title/service1/node_modules/egg-cluster/lib/app_worker.js {"framework":"/Users/mac/Desktop/www/github/egg-scripts--title/service1/node_modules/egg","baseDir":"/Users/mac/Desktop/www/github/egg-scripts--title/service1","workers":4,"plugins":null,"https":false,"title":"egg-server-service1","clusterPort":62486}
然后过滤:
let processList = yield this.helper.findNodeProcess(item => { const cmd = item.cmd; // 匹配egg-scripts start启动的进程,匹配不了pm2 start service.js启动的进程 return argv.title ? cmd.includes('start-cluster') && cmd.includes(util.format(osRelated.titleTemplate, argv.title)) : cmd.includes('start-cluster'); });
由于只校验了子串start-cluster
,而误杀其他进程。即便有title
参数时,都会杀掉同title
名进程,没有title
参数时会杀掉所有start-cluster
启动的进程。
如果校验带上process.cwd()
,则只会对本项目而言。
一个已验证的简单粗暴commit
同上,校验进程子串'egg-cluster\\lib\\agent_worker.js'
,而导致其他服务被列出。
[egg-scripts] stopping egg application [egg-scripts] got master pid ["5660"] [egg-scripts] got worker/agent pids ["6423","6784","6785","6790","6798"] that is not killed by master [egg-scripts] stopped
虽然上一个stop
误杀其他进程,但是剩下由pm2
启动一个入口js文件的方式没有被杀,而列出的那些信息让人以为进程kill失败(其实它列出的是pm2
启动的那些进程)。究其原因如下:同上,过滤子串而不够彻底。
// 不管是egg-scripts start 还是pm2 start service.js都会匹配。 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', }; 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)); });
// pm2入口启动 'use strict'; const egg = require('egg'); const workers = 4; // ... egg.startCluster({ workers, baseDir: __dirname, }); Context Node Version: 8.12.0 Egg Version: 2.23.0 Plugin Name: egg-scripts Plugin Version: 2.11.0 Platform: ubuntu16.04
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。