如果脚本被杀死,node.js会产生进程

cas*_*son 12 spawn child-process node.js

是否有可能确保使用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);
Run Code Online (Sandbox Code Playgroud)

如果我查看进程树,我会看到:

$ 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
Run Code Online (Sandbox Code Playgroud)

然后我需要停止该脚本,不能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
Run Code Online (Sandbox Code Playgroud)

您可以看到尾部进程仍在运行,并且已与任何父进程分离.

如果生成器被杀,是否有一种编程方法可以杀死一个衍生过程?

有没有我可以传递给spawn的选项,或者我应该使用不同的方法,还是我需要捕获kill信号(并且这对于kill -9有效)?

cjo*_*ohn 15

不是很劳动,但这是我使用的模板:

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);
Run Code Online (Sandbox Code Playgroud)

当主进程终止时,我主要使用它来杀死集群中的worker.艾德:显然,你可以killWorkers随时随地打电话,而不仅仅是碰撞或中断.