2011-07-26 22 views
19

ile birlikte yaşanmıyor Yeni bir işlemi engellemek için child_process.exec/child_process.spawn kullandım ve child.kill/process.kill kullanarak öldürün. cat/ls gibi basit ikili yürütücülerle iyi çalışır ve alt işlem yalnızca öldürülür.Çocuk işlemi, Node.JS

Ancak ne zaman komut (diyelim P1)o çatallar başka çocuk süreç (diyelim P2) olsun, yalnızca komut yorumlayıcı P1 öldürüyorlar, yok çocuk süreç P2.

SORU: Böyle bir çocuk işlemi P2'nin Node.JS ile öldürülmesinin bir yolu var mı?

Kod run_and_kill('firefox') ile run_and_kill('ls -Al /usr/lib') ince ama tamam değil çalışır:

function run_and_kill(cmd) { 
    var exec = require('child_process').exec, 
     ls = exec(cmd); 
    console.log('Child process started: %d', ls.pid); 
    ls.on('exit', function(code, signal) { 
     console.log('exit with code %s and signal %s', code, signal); 
    }); 
    ls.kill(); 
} 
+0

el ile öldürmeyi deneyebilirsiniz (muhtemelen P2 SIGHUP'u göz ardı eder) - http://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes –

+0

@AndreySidorov El ile nasıl öldürülür w PID'ini biliyor mu? – Ghostoy

+0

bunu biliyorsunuz - 'ls.pid' (https://github.com/joyent/node/blob/master/lib/child_process.js#L250) –

cevap

1

Ben senin P2 çatal veya P1 bir çocuk değil, onun tarafından olurken bir paralel süreç ne olduğunu düşünüyorum. Firefox durumunda (en azından Linux'ta) firefox uygulaması bir sarmalayıcı kabuk betiği tarafından başlatılır. Eğer itfaiyeci her zaman olacaksa, ikili klasörün kurulumundan daha iyi bir şekilde çalıştırın.

3

Bunu başarmak için bulduğum en güvenli yol, child.pid argümanını kullanarak sinyali öldürmek için bir spawn süreci oluşturmasıdır. çatal Örnek:

var process; 
process = require('child_process'); 

var fork, child; 
fork = process.fork; 
child = fork('./index'); 

var spawn; 
spawn = process.spawn; 
spawn('kill', [child.pid]); 
console.log('sending SIGTERM to child process (socket server)'); 

Genellikle başlatmak için çok beforeAll/afterall blok, özellikleri bu kullanım/sunucuları öldürmek (örnekte' ./index.js').

+0

, bu * çocuk süreçleri de dışarı çıktığı sürece :) çalışır. –