2013-04-05 10 views
23

node.js प्रक्रिया से बाहर निकलने पर सभी बाल प्रक्रियाओं को कैसे मारें (child_process.spawn का उपयोग करके उत्पन्न)?बाहर निकलने पर सभी बाल प्रक्रियाओं को कैसे मारें?

+0

[इसे एक संदर्भ दें] (http://stackoverflow.com/questions/5266152/how-to-exit-in-node-js) – karthick

उत्तर

16

मुझे लगता है कि ऑब्जेक्ट spawn द्वारा लौटाया गया ऑब्जेक्ट का संदर्भ रखने का एकमात्र तरीका है, और मास्टर प्रक्रिया से बाहर निकलने पर इसे मार दें।

एक छोटा सा उदाहरण:

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

मेरे मैक पर, किसी भी बच्चे के प्रोप्रोनिस शुरू हो जाते हैं जब मुख्य नोड प्रक्रिया खत्म। शायद यह ओएस विशिष्ट है? – AndyD

+0

मेरे मैक पर (10.8.3) वे आगे बढ़ते रहते हैं: ऊपर दिए गए कोड के साथ, जब मैं 'child.kill()' पर टिप्पणी करता हूं, तो मैं संक्षेप में (10 सेकंड ऊपर तक) आउटपुट में तीन 'नींद' प्रक्रियाओं को देखता हूं मास्टर प्रक्रिया के बाद 'ps' बंद हो गया है (हालांकि उन प्रक्रियाओं को खोल के नियंत्रक टर्मिनल से जोड़ा जाता है; जब मैं खोल को मारता हूं, तो वे चले जाते हैं)। – robertklep

+1

दिलचस्प। मेरी बाल प्रक्रिया एक प्रेतोज़ प्रक्रिया है। शायद वह अलग व्यवहार करता है। यदि उपरोक्त कोड बदलता है तो मैं उपरोक्त कोड का उपयोग करूंगा। (10.8.0) – AndyD

17

@ robertklep के जवाब देने के लिए जोड़ने के लिए:

हैं, मेरे जैसे, आप जब नोड बाहर से हत्या कर दी जा रही है ऐसा करना चाहते हैं, बल्कि अपनी ही पसंद के से , आपको सिग्नल के साथ कुछ चालबाजी करना है।

कुंजी जो कुछ संकेत (रों) आप के साथ मारा जा सकता है के लिए, नहीं तो नोड डिफ़ॉल्ट रूप से process पर exit उत्सर्जन नहीं होगा सुनने और process.exit() कॉल करने के लिए है!

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

यह करने के बाद, आप बस exit को process पर सामान्य रूप से सुन सकते हैं।

एकमात्र मुद्दा SIGKILL पकड़ा नहीं जा सकता है, लेकिन यह डिज़ाइन द्वारा किया गया है। आपको kill आईएनजी SIGTERM (डिफ़ॉल्ट) के साथ होना चाहिए।

अधिक के लिए this question देखें।

संबंधित मुद्दे