2013-02-21 31 views
7

Aşağıdaki kod içinde child_process.spawn Çocuk süreçleri() temizlemek için: çıkmadan çocuk sürecini beklemedennode.js

#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [100],); 

throw new Error("failure"); 

çocuk işlemi olarak çoğaltılır ve çıkışlarında.

Nasıl bekleyebilirim? Ben waitpid (2) aramak istiyorum ama child_process hiç beklemediğim görünüyor (2).

EKLENDİ:

Üzgünüm, gerçekten ne istediğini ebeveyn var olduğunda çocuk öldürme işlemi yerine onu beklemektir.

+0

bir err atarsan veya hata yakalanmazsa uygulama çıkar. Çocuk sürecini beklemek ve sonra uygulamadan çıkmak ister misiniz? – pfried

+1

Aslında, ana işlem çıktığında alt işlemi durdurmak istiyorum. –

cevap

13
#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [10]); 

x.on('exit', function() { 
    throw (new Error("failure")); 
}); 

DÜZENLEME:

Sen process.on('exit', function() { x.kill() })

gibi ana process için bir dinleyici ekleyerek Ama bu sorunun gibi bir hata atarak ana süreç için dinleyebilir

, daha iyi süreci kapatmak process.exit()

#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [100]); 

process.on('exit', function() { 
    x.kill(); 
}); 

process.exit(1); 
+0

process.on ('exit') ve process.on ('uncaughtException') istediğimi yapabilir. Teşekkürler! –

+3

lütfen cevabınızı kabul ederseniz, cevabı kabul ederseniz – pfried

+0

sorununu çözdüğünüzde çocuk sürecini beklemeniz gerekiyor, aksi takdirde çocuk süreci bir zombi sürecine dönüşecektir. Üst süreç çıkarıldığında, pid 1 (init), temizleme işini alır. Bu teknik, teknik olarak çalışır, eğer ebeveyn, çıkmadan önce kendi pisliğini temizlerse daha iyi olur. –

3
#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [10]); 

process.on('exit', function() { 
    if (x) { 
    x.kill(); 
    } 
}); 
+1

'if (x)' çocuk işleminin x.kill() 'den önce çıkıp çıkmadığını kontrol eder ve yanlışlıkla yeniden atanmış bir PID'ye sahip olan bir işlemi yanlışlıkla öldürebilir mi? – Sukima