UNIX ソケット経由で子プロセスと通信するマスター プロセスがあります。マスター プロセスが SIGQUIT を受信したときに、子のソケットに書き込むことができません。子プロセスに、マスターが終了していることを認識させ、正常に終了させたいと考えています。
SIGQUIT トラップ外の通信は、期待どおりに完全に機能します。
問題を再現するサンプル コードを次に示します。CRTL + \ は SIGQUIT を送信することに注意してください。(CTRL + C は SIGINT)
マスター プロセス: test.js
var net = require("net");
var spawn = require("child_process").spawn;
var socket = new net.Socket();
path_to_worker = process.cwd() + "/test_child.js"
var child = spawn("node", [path_to_worker]);
child.stdout.on('data', function (data) {process.stdout.write(data);})
setTimeout(function() {
socket.connect("/tmp/node-sock", function () {
socket.on('data', function(data) {
console.log(data.toString());
});
});
}, 100)
process.on("SIGQUIT", function () {
socket.write("This won't appear");
});
子プロセス: test_child.js
var net = require("net");
var socket = new net.Socket();
console.log("Started");
net.createServer(function (server_socket) {
server_socket.on('data', function(data) {
console.log(data.toString());
});
server_socket.write("This will appear");
}).listen("/tmp/node-sock");
子プロセスは制御不能であり、マスクを使用して SIGKILL と SIGTERM 以外のすべてのシグナルをブロックしています。SIGQUIT トラップ中にソケットに書き込むことができない場合、ソケット以外に通信する別の方法はありますか?