2012-08-09 50 views
11

是否有可能確保父進程被終止時,使用node.js child_process產生的進程將被終止?node.js如果腳本死亡,產生的進程將繼續存在

下面是一個示例腳本

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: [email protected]/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 

您可以看到尾進程仍在運行並且已經與任何pa分離出租。

如果產卵者死亡,是否有一種程序化的方法來殺死衍生過程?

是否有我可以傳給產卵的選項,或者我應該使用不同的方法,還是需要捕獲kill信號(並且可以用於kill -9)?

+0

我的問題恰恰相反。如果父母死亡,產卵的過程不會保持活躍,這就是我想要的。 – cprcrack 2014-05-14 10:14:59

+1

更新:似乎只發生在Windows上。 – cprcrack 2014-05-14 10:32:36

回答

14

不是很友好的勞動,但是這作爲我用的模板:

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,不只是崩潰或中斷。

+0

請注意,kill -9仍然會讓工作人員周圍。對於我的用例可能沒問題,但要小心 – 2012-08-10 15:31:04

+0

對。 'kill -9'實際上不會觸發進程的'退出'事件;不確定在這種情況下你會如何捕捉它。 – cjohn 2012-08-10 20:55:39