मुझे 2 समाधान मिले, दोनों सही नहीं हैं।
1. सभी बच्चों को मार डालो (-पिड) जब SIGTERM संकेत प्राप्त किया।
जाहिर है, यह समाधान "किल -9" को संभाल नहीं सकता है, लेकिन यह ज्यादातर मामलों के लिए काम करता है और बहुत सरल है क्योंकि इसे सभी बाल प्रक्रियाओं को याद रखने की आवश्यकता नहीं है।
var childProc = require('child_process').spawn('tail', ['-f', '/dev/null'], {stdio:'ignore'});
var counter=0;
setInterval(function(){
console.log('c '+(++counter));
},1000);
if (process.platform.slice(0,3) != 'win') {
function killMeAndChildren() {
/*
* On Linux/Unix(Include Mac OS X), kill (-pid) will kill process group, usually
* the process itself and children.
* On Windows, an JOB object has been applied to current process and children,
* so all children will be terminated if current process dies by anyway.
*/
console.log('kill process group');
process.kill(-process.pid, 'SIGKILL');
}
/*
* When you use "kill pid_of_this_process", this callback will be called
*/
process.on('SIGTERM', function(err){
console.log('SIGTERM');
killMeAndChildren();
});
}
उसी तरह, आप 'एग्जिट' हैंडलर को उपरोक्त तरीके से स्थापित कर सकते हैं यदि आप कहीं कॉल करते हैं। नोट: Ctrl + C और अचानक क्रैश ओएस द्वारा स्वचालित रूप से प्रोसेस ग्रुप को मारने के लिए संसाधित किया गया है, इसलिए यहां और नहीं।
2.Use chjj / pty.js अपनी प्रक्रिया को नियंत्रित करने के लिए टर्मिनल संलग्न के साथ।
जब आप किसी भी तरह से -9 तक भी वर्तमान प्रक्रिया को मारते हैं, तो सभी बाल प्रक्रियाएं स्वचालित रूप से भी (ओएस द्वारा) मार दी जाएंगी। मेरा अनुमान है कि क्योंकि वर्तमान प्रक्रिया टर्मिनल का दूसरा पक्ष रखती है, इसलिए यदि वर्तमान प्रक्रिया मर जाती है, तो चाइल्ड प्रोसेस को SIGPIPE की मृत्यु हो जाएगी।
var pty = require('pty.js');
//var term =
pty.spawn('any_child_process', [/*any arguments*/], {
name: 'xterm-color',
cols: 80,
rows: 30,
cwd: process.cwd(),
env: process.env
});
/*optionally you can install data handler
term.on('data', function(data) {
process.stdout.write(data);
});
term.write(.....);
*/