簡體   English   中英

如果腳本被殺死,node.js會產生進程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM