Socket.io启动输出会杀死node.js守护程序的Upstart脚本

时间:2011-08-31 21:37:52

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

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

在读取Socket.io配置之前执行此操作。 Socket.io documentation表明我可以将一个'log'选项传递给listen方法,以防止sys.log将输出发送到stdout。但我似乎无法保持最初的'info - (Socket.io started)'不被输出。我甚至试图在模块中注释掉对logger的调用,但是它被缓存了。

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

upstart script

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" });
});

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

我收到来自tedah的消息,他是一名Socket.io撰稿人。他的回答是这个问题是通过监听器方法将选项传递给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等绑定到容器的(self)emit方法,忽略options.logger.debug