2012-08-09 19 views
11

o ana öldürülünce node.js child_process ile başlatılan süreçler öldürülecek emin olmak mümkün mü? diyelim (O senaryoyu durdurmak için gereken sonradan Sonranode.js komut ölürse süreç etrafında yapışır olurken

$ 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 

ve Ctrl-C alamazsınız: süreç ağacının bakarsak İşte

Bunu görmek bir örnek komut

var spawn = require('child_process').spawn; 
var log_tail = spawn("tail", ["-f", "/dev/null"]); 

setInterval(function() { 
    console.log('just chilling'); 
}, 10000); 

var ssh bağlantım kayboldu)

$ kill 10149 
$ ps faux 
ubuntu 10151 0.0 0.0 7184 608 pts/7 S 15:07 0:00 tail -f /dev/null 

Kuyruk işleminin hala devam ettiğini ve herhangi bir pa bağlantısından ayrıldığını görebilirsiniz. kira.

yumurtlayan ölürse bir olurken süreci öldürmek için programatic yolu var mı?

Ben yumurtlamaya geçebilir ya da ben farklı bir yöntem kullanmak ya da ben öldürmek sinyalini yakalamak gerekiyor gereken bir seçenek var mı (ve irade bir öldürme için bu çalışma -9)?

+0

Sorunum tam tersidir. Ebeveynler ölürse yumurtlu süreçler canlı tutulmaz ve istediğim şey budur. – cprcrack

+1

Güncelleme: Sadece Windows üzerinde görünüyor. – cprcrack

cevap

14

Değil çok emek dostu, ancak bu kullandığım şablon olarak hizmet eder:

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

Ben öncelikle ana süreç öldüğünde bir kümede işçileri öldürmek için bunu kullanın. Ed: Açıkçası, sadece çökme ya da kesintiler değil, her yerden killWorkers'u arayabilirsin.

+0

no'lu cinayet -9'un hala işçileri bırakacağını unutmayın. Benim kullanım durumum için muhtemelen tamam, ama –

+0

sağa dikkat edin. '-9' kill aslında sürecin 'çıkış' olayını bile ateşlemez; Bu durumda düğümü nasıl yakalayacağınızdan emin değilsiniz. – cjohn