如果脚本被杀死,node.js 生成的进程仍然存在

Posted

技术标签:

【中文标题】如果脚本被杀死,node.js 生成的进程仍然存在【英文标题】:node.js spawned process sticks around if script is killed 【发布时间】:2012-08-07 04:29:11 【问题描述】:

是否可以确保使用 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 有效)?

【问题讨论】:

我的问题正好相反。如果父进程死亡,生成的进程不会保持活动状态,这就是我想要的。 更新:似乎只发生在 Windows 上。 【参考方案1】:

对劳动力不太友好,但这是我使用的模板:

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);

我主要使用它来在主进程死亡时杀死集群中的工作人员。 Ed:显然,您可以从任何地方调用killWorkers,而不仅仅是崩溃或中断。

【讨论】:

请注意, kill -9 仍然会留下工人。对于我的用例,这可能没问题,但要小心 对。 kill -9 实际上甚至不会触发进程的 exit 事件;不确定在这种情况下如何在节点内捕获它。

以上是关于如果脚本被杀死,node.js 生成的进程仍然存在的主要内容,如果未能解决你的问题,请参考以下文章

停止Node服务器

Node.js 进程在 aws 实例上被杀死

Android应用程序是否有可能杀死自己的进程

如何杀死 node.js 上的打开进程?

Activity 被杀死并重新创建后,碎片仍然存在

如何在nodejs中创建线程