首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在永远运行的NodeJS上正常关闭UNIX-socket服务器

在永远运行的NodeJS上正常关闭UNIX-socket服务器
EN

Stack Overflow用户
提问于 2013-04-24 04:08:42
回答 3查看 9.7K关注 0票数 19

我有一个NodeJS应用程序,它设置了一个UNIX套接字来公开一些进程间通信通道(某种监视内容)。/tmp/app-monitor.sock-socket文件放置在UNIX文件夹(即UNIX)中。

代码语言:javascript
复制
var net = require('net');
var server = net.createServer(...);
server.listen('/tmp/app-monitor.sock', ...);

我使用信号处理(SIGINT、SITERM等)正常关闭服务器并删除套接字文件。

代码语言:javascript
复制
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服务器)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-12 07:26:43

正如其他人所提到的,你不能做任何事情来响应SIGKILL,这就是为什么forever (和其他所有人)不应该使用SIGKILL,除非在极端情况下。所以你能做的最好的事情就是在另一个过程中进行清理。

我建议你一开始就清理干净。当您获得EADDRINUSE时,尝试连接到套接字。如果套接字连接成功,则另一台服务器正在运行,因此该实例应该退出。如果连接失败,则可以安全地取消套接字文件的链接并创建一个新的套接字文件。

代码语言:javascript
复制
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');
});
票数 46
EN

Stack Overflow用户

发布于 2013-05-08 05:26:16

你应该能够使用SIGTERM来做你想做的事情:process.on('SIGTERM', shutdown)

票数 2
EN

Stack Overflow用户

发布于 2013-05-09 03:56:40

由于您无法处理SIGKILL,并且您希望永远使用(它使用SIGKILL),因此您必须使用一种变通方法。

例如,首先发送关闭服务器的信号,然后执行永久重启:

代码语言:javascript
复制
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:

代码语言:javascript
复制
process.on('SIGUSR1', gracefullyShutdownMyServer);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16178239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档