3

Socket.io を使用して接続されたクライアントにメッセージをブロードキャストする Node スクリプトがあります。Upstart スクリプトを使用してバックグラウンド プロセスとして実行したいと考えています。でデーモンを起動するsudo start my_serverと、プロセスが起動して実行されます。しかし、Socket.ioの標準出力「info - (Socket.io started)」でサーバーが即停止。

これは、Socket.io 構成が読み取られる前に実行されます。Socket.io のドキュメントには、「log」オプションをリッスン メソッドに渡して、sys.log が出力を stdout に送信しないようにすることができることが示されています。しかし、その最初の「info - (Socket.io started)」が出力されないようにすることはできないようです。モジュールでロガーへの呼び出しをコメントアウトしようとしましたが、キャッシュされています。

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

回答または解決策をいただければ幸いです。

4

2 に答える 2

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) 再起動すると、キャッシュはなくなるはずです。

于 2011-08-31T22:19:16.297 に答える
1

Socket.io の寄稿者であるtedahからメッセージを受け取りました。この問題に対する彼の答えは、リスナー メソッドなどを介して manager.js にオプションを渡すことでした…</p>

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

etcoptions.logger.infoはコンテナーの (自己) 発行メソッドにバインドされ、options.logger.debug無視されます。

于 2011-09-01T13:54:55.930 に答える