1

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 トラップ中にソケットに書き込むことができない場合、ソケット以外に通信する別の方法はありますか?

4

1 に答える 1

0

Githib から、koichik が私の質問に答えました: https://github.com/joyent/node/issues/1308#issuecomment-1552790

kill -SIGQUIT (C- ではない) で SIGQUIT を親プロセスに送信しましたが、動作します。

$ node test.js
Started
This will appear
This won't appear

そこで、コードを test.js に追加して C- を押します。

child.on('exit', function(code, signal) {
  console.log(' child died', code, signal);
});

結果:

$ node test.js
Started
This will appear
^\ child died null SIGQUIT

SIGQUIT は、親プロセスだけでなく子プロセスにも送信されました。したがって、コードを test_child.js に追加しました。

process.on("SIGQUIT", function () {
  console.log(' child received SIGQUIT');
});

結果:

$ node test.js
Started
This will appear
^\ child received SIGQUIT
This won't appear
于 2011-07-12T18:45:12.707 に答える