我一直在做同样的事情,在不同的微服务上启动多个 lein run 实例。为了杀死他们,我一直在使用npm install tree-kill
基本示例
var kill = require('tree-kill');
var spawn = require('child_process').spawn;
var proc = spawn("lein", ["run"], {cwd: './some-dir', detached: true});
setTimeout(function(){kill(proc.pid); console.log('Take that!');}, 5000);
更多真实示例
var kill = require('tree-kill');
var chalk = require('chalk');
exports.killIfAlive= function(pid) {
try {
kill(pid);
}
catch(ex) {
console.error(ex);
}
};
exports.kill = function(projects) {
var pids = exports.readPIDFile();
projects.forEach(function(project) {
if (pids[project]) {
console.log('Killing', chalk.cyan(project), chalk.magenta('(pid:', pids[project], ')'));
exports.killIfAlive(pids[project]);
}
else {
console.log(chalk.cyan(project), chalk.grey('is not running.'));
}
delete pids[project];
});
return exports.writePIDFile(pids);
};
在启动每个项目后,我将其 pid 存储到一个简单的对象中,例如 {project1: 12352, project2: 50943},然后将其写入文件系统。由于我使用detached 选项运行spawn('lein' ... etc),因此我当前的节点进程可能会在不取出我的leiningen 进程的情况下死亡。每当我恢复我的节点进程时,它都可以使用 pid 文件来查找和终止一个或多个项目。采用这种方法时,可能会出现竞争条件,即您的具有给定 pid 的 lein 进程已经死亡,并且在该 pid 下启动了一个新进程,我将留给其他人处理。