Почему я не могу писать в сокет дочернего процесса во время SIGQUIT? - PullRequest
1 голос
/ 11 июля 2011

У меня есть мастер-процесс, который связывается с дочерними процессами через сокеты 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 просто невозможно выполнить запись в их сокет, есть ли другой способ связи с ними, кроме сокетов?

1 Ответ

0 голосов
/ 12 июля 2011

От Гитиба коичик ответил на мой вопрос: https://github.com/joyent/node/issues/1308#issuecomment-1552790

Я отправил SIGQUIT родительскому процессу с помощью kill -SIGQUIT (не C-), все работает.

$ 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
...