我正在尝试终止群集工作者,而不需要释放一些资源。这是我在worker中使用的代码:
server.on("close", function() {
process.exit();
});
server.close();
当worker从master获取命令时执行此代码。 "关闭"回调被叫,但我无法访问工人正在使用的任何端口。所以我有这个代码
var server = require('http').createServer(function(req, res) {
res.writeHead(200);
res.end('');
});
server.listen(8080);
如果我退出后重新启动工作人员,我会得到EADDRINUSE'对于8080端口的listen()。
答案 0 :(得分:1)
请运行此脚本以终止与节点相关的进程。并再次运行您的代码
(function(){
"use strict";
var exec = require('child_process').exec,
lCmd = 'kill -9' + ' ' + /* kill finded process */
'`ps ax' + '|' + /* show all process */
'grep node-openshift' + '|' + /* find node-openshift */
'grep -v grep' + '|' + /* exlude grep command */
'awk "{print $1}"`'; /* show first collumn */
exec(lCmd, function(error, stdout, stderr){
console.log(error || stdout || stderr);
});
})();
答案 1 :(得分:0)
事实证明,Socket.io(在端口上侦听的是什么)在终止之前不会释放端口。这样做是为了允许端口重用。我能够使用与之前使用的完全相同的端口重新创建socket.io实例。因此,如果我使用端口8080连接到购物车的socket.io连接和端口8081连接负责建议的套接字,我将不得不在下次创建购物车套接字实例时调用listen(8080)
。
我想在不同的时间为不同的连接使用不同的端口。我试图宣布连接,因为它们可用,但我想我现在必须硬编码不同服务的端口。至少EADDRINUSE不再出现了。