【问题标题】:Socket.io startup output kills Upstart script for node.js daemonSocket.io 启动输出杀死 node.js 守护进程的 Upstart 脚本
【发布时间】:2011-11-07 23:46:09
【问题描述】:

我有一个 Node 脚本,它使用 Socket.io 向连接的客户端广播消息。我想使用 Upstart 脚本将它作为后台进程运行。我可以用sudo start my_server 启动守护进程,该进程将启动并运行。但是,Socket.io 的标准输出“info - (Socket.io started)”会立即停止服务器。

这是在读取 Socket.io 配置之前执行的。 Socket.io documentation 表明我可以将“日志”选项传递给监听方法,以防止 sys.log 将输出发送到标准输出。但是我似乎无法阻止输出最初的“信息-(Socket.io 已启动)”。我什至试图在模块中注释掉对 logger 的调用,但它被缓存了。

是否有人成功创建了 node/socket.io 守护进程或抑制了 socket.io 的默认输出?下面是我的 Upstart 脚本和 node.js 的代码。

新贵脚本

description "node.js server"
author      "some@email.com"

start on started mountall
stop on shutdown

respawn
respawn limit 99 5

script
   export HOME="/username"

   exec sudo -u username sh -c "/usr/local/bin/node path/to/server.js >> /var/log/node.log 2?&1"
end script

server.js 使用 socket.io

var http = require('http'),
url = require('url'),
fs = require('fs'),

//create server and attach socket io
server = http.createServer(function(req, res){
        res.writeHead(200,{ 'Content-Type': 'text/html' }); 
        res.end('<h1>Hello Socket Lover!</h1>');
      }),
io = require('socket.io').listen(server, function(message){});

//configure socket.io logging so it is minimal
io.configure(function(){
io.set('log level', 1);
io.set('transports', [
    'websocket',
    'flashsocket',
    'htmlfile',
    'xhr-polling',
    'jsonp-polling'
    ]);
});

//instruct our server to listen to port 8080    
server.listen(8080);

io.sockets.on('connection', function (socket) {
   socket.emit('message', { eventType: "connected" });
});

感谢任何答案或解决方案。

【问题讨论】:

  • 我认为你应该在 github 上填写一个问题,因为即使我覆盖了记录器等,第一条消息仍然会显示在屏幕上。

标签: logging node.js daemon socket.io upstart


【解决方案1】:

我收到了来自 Socket.io 贡献者 tedah 的消息。他对这个问题的回答是通过 listener 方法将选项传递给 manager.js……

options.logger = {
   info: self.emit.bind(self, 'info'),
   error: self.emit.bind(self, 'error'),
   warn: self.emit.bind(self, 'error'),
   debug: new Function()
 };

var io = socketIo.listen(port, options);

options.logger.info 等绑定到容器的(自我)发射方法,options.logger.debug 被忽略。

【讨论】:

    【解决方案2】:

    该语句位于第 117 行的 /usr/local/lib/node_modules/socket.io/lib/manager.js 中,用于 socket.io 0.7.9(如果您不使用全局 npm 安装,那么它将在安装 npm 模块的任何地方)。打开文件,转到第 117 行并将其注释掉。然后清理缓存(npm cache clean $HOME/.npm/socket.io)并重新启动它应该就消失了。

    【讨论】:

    • 非常感谢您的帮助。我想要更多优雅的解决方案,有时如果可行的话。
    • 一个更优雅的解决方案是在 github 上报告它,以便在下一个版本中消失:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多