我有一个NodeJS应用程序,它设置了一个UNIX套接字来公开一些进程间通信通道(某种监视内容)。/tmp/app-monitor.sock
-socket文件放置在UNIX文件夹(即UNIX)中。
var net = require('net');
var server = net.createServer(...);
server.listen('/tmp/app-monitor.sock', ...);
我使用信号处理(SIGINT、SITERM等)正常关闭服务器并删除套接字文件。
function shutdown() {
server.close(); // socket file is automatically removed here
process.exit();
}
process.on('SIGINT', shutdown);
// and so on
我的应用程序使用forever start ...
运行,以监视它的生命周期。
我对forever restartall
命令有问题。当永远执行restartall
时,它使用SIGKILL
来终止所有子进程。SIGKILL
不能由进程处理,所以我的应用程序在没有任何关闭程序的情况下就会死掉。
问题是使用SIGKILL
时未删除的套接字文件。子进程重新启动后,无法启动新服务器,因为listen
调用将导致EADDRINUSE
错误。
我无法在应用程序启动期间删除现有的套接字文件,因为我不知道它是真正的工作套接字还是之前不干净关闭的一些痕迹。
所以问题是..。处理这种情况的更好方法是什么(SIGKILL和UNIX-socket服务器)?
发布于 2013-05-12 07:26:43
正如其他人所提到的,你不能做任何事情来响应SIGKILL,这就是为什么forever
(和其他所有人)不应该使用SIGKILL,除非在极端情况下。所以你能做的最好的事情就是在另一个过程中进行清理。
我建议你一开始就清理干净。当您获得EADDRINUSE
时,尝试连接到套接字。如果套接字连接成功,则另一台服务器正在运行,因此该实例应该退出。如果连接失败,则可以安全地取消套接字文件的链接并创建一个新的套接字文件。
var fs = require('fs');
var net = require('net');
var server = net.createServer(function(c) { //'connection' listener
console.log('server connected');
c.on('end', function() {
console.log('server disconnected');
});
c.write('hello\r\n');
c.pipe(c);
});
server.on('error', function (e) {
if (e.code == 'EADDRINUSE') {
var clientSocket = new net.Socket();
clientSocket.on('error', function(e) { // handle error trying to talk to server
if (e.code == 'ECONNREFUSED') { // No other server listening
fs.unlinkSync('/tmp/app-monitor.sock');
server.listen('/tmp/app-monitor.sock', function() { //'listening' listener
console.log('server recovered');
});
}
});
clientSocket.connect({path: '/tmp/app-monitor.sock'}, function() {
console.log('Server running, giving up...');
process.exit();
});
}
});
server.listen('/tmp/app-monitor.sock', function() { //'listening' listener
console.log('server bound');
});
发布于 2013-05-08 05:26:16
你应该能够使用SIGTERM来做你想做的事情:process.on('SIGTERM', shutdown)
发布于 2013-05-09 03:56:40
由于您无法处理SIGKILL
,并且您希望永远使用(它使用SIGKILL
),因此您必须使用一种变通方法。
例如,首先发送关闭服务器的信号,然后执行永久重启:
kill -s SIGUSR1 $pid
# $pid contains the pid of your node process, or use
# killall -SIGUSR1 node
sleep 2
forever restart test.js
在你的js句柄中,SIGUSR1:
process.on('SIGUSR1', gracefullyShutdownMyServer);
https://stackoverflow.com/questions/16178239
复制相似问题