我有一个通过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陷阱期间根本无法写入其套接字,是否有其他方式与套接字进行通信而不是套接字?
答案 0 :(得分: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