Tôi tìm thấy 2 giải pháp, cả hai đều không hoàn hảo.
1. Giết tất cả trẻ em bằng cách giết (-pid) khi nhận được tín hiệu SIGTERM.
Rõ ràng, giải pháp này không thể xử lý "kill -9", nhưng nó hoạt động trong hầu hết các trường hợp và rất đơn giản vì nó không cần phải nhớ tất cả các quy trình con.
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();
});
}
Theo cách tương tự, bạn có thể cài đặt trình xử lý 'exit' như cách trên nếu bạn gọi process.exit ở đâu đó. Lưu ý: Ctrl + C và sự cố bất ngờ đã được hệ điều hành tự động xử lý để tiêu diệt nhóm quá trình, vì vậy không còn ở đây nữa.
2.Sử dụng chjj / pty.js để sinh ra quy trình của bạn với thiết bị đầu cuối kiểm soát được đính kèm.
Khi bạn giết tiến trình hiện tại bằng cách nào đó thậm chí giết -9, tất cả các tiến trình con cũng sẽ tự động bị giết (bởi HĐH?). Tôi đoán rằng vì quy trình hiện tại giữ một mặt khác của thiết bị đầu cuối, vì vậy nếu quy trình hiện tại chết, quy trình con sẽ nhận được SIGPIPE nên chết.
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(.....);
*/