2013-04-05 19 views

cevap

16

Tek yol, spawn tarafından döndürülen ChildProcess nesnesine bir başvuru tutmak ve ana işlemden çıktığınızda onu öldürmek olduğunu düşünüyorum.

Bir küçük örnek:

var spawn  = require('child_process').spawn; 
var children = []; 

process.on('exit', function() { 
    console.log('killing', children.length, 'child processes'); 
    children.forEach(function(child) { 
    child.kill(); 
    }); 
}); 

children.push(spawn('/bin/sleep', [ '10' ])); 
children.push(spawn('/bin/sleep', [ '10' ])); 
children.push(spawn('/bin/sleep', [ '10' ])); 

setTimeout(function() { process.exit(0) }, 3000); 
+0

my mac, spawn tarafından başlatılan tüm alt işlemler ana düğüm işlemi sırasında öldürülür bitirir. Belki bu OS özgüdür? – AndyD

+0

Mac'imde (10.8.3) devam ediyorlar: Yukarıdaki kodu kullanarak, child.kill() işlevini açıkladığımda, kısaca (10 saniye geçene kadar) çıkışta üç 'uyku 'sürecini görüyorum. master işlemi durduktan sonra ps '(bu işlemler kabuk kontrolör terminaline bağlı olsa da, kabuğu öldürdüğümde, giderler). – robertklep

+1

İlginç. Çocuk sürecim bir phantomjs sürecidir. Belki de farklı davranır. Yukarıdaki kodu, değiştirirse kullanacağım. (10.8.0) – AndyD

17

@ robertklep cevabı eklemek için: Düğüm dışarıdan öldürülüyor zaman benim gibi, daha ziyade kendi seçtikleri daha bunu yapmak istiyorum, Eğer

Sinyaller ile biraz hile yapmak zorundasın.

anahtar Düğüm process üzerinde exit vermeyecektir varsayılan olarak aksi takdirde öldürülmüş olabilir ne olursa olsun sinyal (ler) için dinlemek ve process.exit() çağrı etmektir!

var cleanExit = function() { process.exit() }; 
process.on('SIGINT', cleanExit); // catch ctrl-c 
process.on('SIGTERM', cleanExit); // catch kill 

Bunu yaptıktan sonra, sadece normal process üzerinde exit dinleyebilirsiniz.

Tek sorun SIGKILL yakalanamıyor, ancak bu tasarım gereğidir. Yine de,SIGTERM (varsayılan) ile olmalıdır. Daha fazla bilgi için bkz. this question Bkz.

İlgili konular