[英]node.js spawned process sticks around if script is killed
是否有可能确保使用node.js生成的进程child_process将在父级被杀死时被终止?
这是一个示例脚本
var spawn = require('child_process').spawn;
var log_tail = spawn("tail", ["-f", "/dev/null"]);
setInterval(function() {
console.log('just chilling');
}, 10000);
如果我查看进程树,我会看到:
$ ps faux
ubuntu 9788 0.0 0.0 73352 1840 ? S 15:04 0:00 | \_ sshd: ubuntu@pts/7
ubuntu 9789 0.0 0.2 25400 6804 pts/7 Ss 15:04 0:00 | \_ -bash
ubuntu 10149 1.0 0.2 655636 8696 pts/7 Sl+ 15:07 0:00 | \_ node test.js
ubuntu 10151 0.0 0.0 7184 608 pts/7 S+ 15:07 0:00 | \_ tail -f /dev/null
然后我需要停止该脚本,不能ctrl-c(说我的ssh连接丢失)
$ kill 10149
$ ps faux
ubuntu 10151 0.0 0.0 7184 608 pts/7 S 15:07 0:00 tail -f /dev/null
您可以看到尾部进程仍在运行,并且已与任何父进程分离。
如果生成器被杀,是否有一种编程方法可以杀死一个衍生过程?
有没有我可以传递给spawn的选项,或者我应该使用不同的方法,还是我需要捕获kill信号(并且这对于kill -9有效)?
不是很劳动,但这是我使用的模板:
var spawn = require("child_process").spawn;
var workers = [];
var killWorkers = function() {
workers.forEach(function(worker) {
process.kill(worker);
});
});
process.on("uncaughtException", killWorkers);
process.on("SIGINT", killWorkers);
process.on("SIGTERM", killWorkers);
var new_worker = spawn("tail", ["-f", "/dev/null"]);
workers.push(new_worker);
当主进程终止时,我主要使用它来杀死集群中的worker。 艾德:显然,你可以从任何地方调用killWorkers
,而不仅仅是崩溃或中断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.