Ich habe 2 Lösungen gefunden, beide nicht perfekt.
1. Töten Sie alle Kinder durch Töten (-pid), wenn Sie das SIGTERM-Signal erhalten.
Offensichtlich kann diese Lösung "kill -9" nicht verarbeiten, funktioniert jedoch in den meisten Fällen und ist sehr einfach, da nicht alle untergeordneten Prozesse gespeichert werden müssen.
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();
});
}
Auf die gleiche Weise können Sie den 'exit'-Handler wie oben beschrieben installieren, wenn Sie process.exit irgendwo aufrufen. Hinweis: Strg + C und plötzlicher Absturz wurden vom Betriebssystem automatisch verarbeitet, um die Prozessgruppe zu beenden, daher hier nicht mehr.
2.Verwenden Sie chjj / pty.js , um Ihren Prozess mit angeschlossenem Steuerungsterminal zu erzeugen .
Wenn Sie den aktuellen Prozess ohnehin mit -9 beenden, werden auch alle untergeordneten Prozesse automatisch beendet (vom Betriebssystem?). Ich vermute, dass der aktuelle Prozess SIGPIPE erhält, wenn der aktuelle Prozess eine andere Seite des Terminals hält. Wenn der aktuelle Prozess stirbt, stirbt er.
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(.....);
*/