1

この質問の回答を読み、問題を解決するために多くの方法を試しましたが、解決できませんでした。したがって、このクエリを私の側から投稿しました。

基本的に、配列内にサービスのリストがあります。これは、NodeJS アプリケーションが実行されている別のボックスで実行されている数で約 1500 になります。私のコードに従って、 /a ボックスに ssh し、スクリプトを期待してから、特定のディレクトリに cd して、各サービスの特定のパスにある特定のファイルに保存されている各サービスバージョン/ビルド ID を取得します。一部のサービスでは、同じファイル (バージョン/ビルド情報を含む) がボックス内の別の場所に保存される可能性があります。したがって、最初のパスで詳細を取得しようとして失敗した場合に備えて、他のスクリプトを使用して別のパスで情報を探すというアルゴリズムをアプリに用意しています。

コードのメイン ブロック:

exports.getservicedetails = function(box,res) {
        var job = [];
        for (i = 0; i < services.length; i++ )
        {
                var children = new Object();
                children.server = services[i];
                children.box = box;
                children.process = spawn('./scripts/info.sh', [children.server , children.box , getStageURL(children.box)]);
                children.runstate = 1;
                job.push(children);
                createChildEvents(job, i, res);
        }
}

ここで、生成された各タスクのすべてのイベントを設定します。

function createChildEvents(child, id, res){
        (child[id]).process.stderr.on('data', function (data) {
                (child[id]).runstate = 0;
        });
        (child[i]).process.on('exit', function (code) {
                (child[id]).runstate = 0;
                checkstate(child, res); // function to check if all spawned tasks has exited
        });
        (child[id]).process.stdout.on('data', function (data) {
                var result = data.toString().split("\r\n"); // split the stdout outputted lines
                for (var i = 0; i < result.length; i++)
                {
                       console.log('Server : ' +  (child[id]).server + " PID : " + (child[id]).process.pid + ' ' + (child[id]).box);
                        if ((child[id]).box.length > 0 && result[i].match(/No such file or directory/gi) != null) {
                                (child[id]).process = spawn('./scripts/info2.sh ',[(child[id]).server, (child[id]).box, getStageURL((child[id]).box)]);
                                (child[id]).box = '';
                                (child[id]).runstate = 1;
                                createChildEvents(child, id, res);
                                break;
                        }
                        if(result[i].match(/release_version*/) != null || result[i].match(/app.version*/) != null)
                                (child[id]).serversion = (result[i].split('='))[1];
                        if(result[i].match(/release_number*/) != null || result[i].match(/app.id*/) != null)
                                (child[id]).serproduct = (result[i].split('='))[1];
                }
        });
}

問題は、以下に示すように 11 番目のコンソール ログを取得した後、次のエラーが表示されることです。

Server : a PID : 27200 myboxname
Server : b PID : 31650 myboxname
Server : d PID : 31644 myboxname
Server : e PID : 31664 myboxname
Server : f PID : 28946 myboxname
Server : g PID : 32507 myboxname
Server : h PID : 29329 myboxname
Server : i PID : 29905 myboxname
Server : j PID : 29883 myboxname
Server : k PID : 481 myboxname
Server : l PID : 777 myboxname
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at EventEmitter.addListener (events.js:168:15)
    at EventEmitter.once (events.js:189:8)
    at Transport.logException (src/node_modules/winston/lib/winston/transports/transport.js:118:8)
    at logAndWait (src/node_modules/winston/lib/winston/logger.js:613:15)
    at async.forEach (src/node_modules/winston/node_modules/async/lib/async.js:86:13)
    at Array.forEach (native)
    at _forEach (src/node_modules/winston/node_modules/async/lib/async.js:26:24)
    at Object.async.forEach (src/node_modules/winston/node_modules/async/lib/async.js:85:9)
    at Logger._uncaughtException (src/node_modules/winston/lib/winston/logger.js:636:9)
    at process.EventEmitter.emit (events.js:115:20)
(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at EventEmitter.addListener (events.js:168:15)
    at EventEmitter.once (events.js:189:8)
    at Transport.logException (src/node_modules/winston/lib/winston/transports/transport.js:117:8)
    at logAndWait (src/node_modules/winston/lib/winston/logger.js:613:15)
    at async.forEach (src/node_modules/winston/node_modules/async/lib/async.js:86:13)
    at Array.forEach (native)
    at _forEach (src/node_modules/winston/node_modules/async/lib/async.js:26:24)
    at Object.async.forEach (src/node_modules/winston/node_modules/async/lib/async.js:85:9)
    at Logger._uncaughtException (src/node_modules/winston/lib/winston/logger.js:636:9)
    at process.EventEmitter.emit (events.js:115:20)

「process.setMaxListeners(0);」を追加してみました コードの多くのポイントでまだこのエラーが表示されますか?

どうすればこの問題を解決できますか? 前もって感謝します。

4

1 に答える 1

3

タイプミスがあります。child[i]それ以外のchild[id]

createChildEventsしたがって、各呼び出しで同じエミッターのリスナーを設定しています。

于 2012-10-22T08:38:03.763 に答える