ฉันพบวิธีแก้ไขปัญหา 2 วิธีทั้งสองไม่สมบูรณ์แบบ
1. ฆ่าเด็กทั้งหมดโดย kill (-pid) เมื่อได้รับสัญญาณ SIGTERM
เห็นได้ชัดว่าวิธีนี้ไม่สามารถจัดการ "kill -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();
});
}
ในทำนองเดียวกันคุณสามารถติดตั้ง 'exit' handler เหมือนข้างบนถ้าคุณเรียก process.exit ที่ไหนสักแห่ง หมายเหตุ: Ctrl + C และความผิดพลาดฉับพลันได้รับการประมวลผลโดยอัตโนมัติโดย OS เพื่อฆ่ากลุ่มกระบวนการดังนั้นไม่ต้องเพิ่มเติมที่นี่
2.use chjj / pty.jsจะวางไข่กระบวนการของคุณด้วยการควบคุมอาคารผู้โดยสารที่แนบมา
เมื่อคุณฆ่ากระบวนการปัจจุบันด้วยการฆ่า -9 กระบวนการลูกทั้งหมดจะถูกฆ่าโดยอัตโนมัติด้วย (โดย OS) ฉันเดาว่าเนื่องจากกระบวนการปัจจุบันถืออีกด้านหนึ่งของเทอร์มินัลดังนั้นหากกระบวนการปัจจุบันตายกระบวนการเด็กจะทำให้ 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(.....);
*/