2017-12-22 15 views
-1

私は開発中のnode.jsアプリケーションを持っています。私がテストしたところ、同じアプリケーションの2つのインスタンスが誤って実行されたことが判明し、いくつかの悪影響をもたらしました。node.js内の同じアプリケーションのマルチインスタンスを拒否する方法は?

これを防ぐ方法を教えてください。おそらく、私のアプリが既に実行されているかどうかを確認する方法があります。もしそうなら、エラーを投げてシャットダウンしてください...

多くの方が助けてください!

+0

同じポートを2回使用している場合は、エラーが表示されます。 EADDRINUSEを聞く。どのポートを実行していますか? – andrewgi

+0

まあ、私は、node.jsがクライアントであるサーバーとしてpythonを使用しています – Anonymous

+0

https://stackoverflow.com/questions/171213/how-to-block-running-two-instances-of-the-same-program#171220これは一般的な解決策です。 – Malice

答えて

1

既知のポートにローカルサーバーを作成する単純なクロスプラットフォームスキームがあります。その後、今後のインスタンスは同じサーバーを作成しようとし、別のインスタンスが既に実行されているため失敗します。

このようなサーバーを使用する利点の1つは、プロセスが何らかの理由で停止した場合、OSが自動的にサーバーを閉じてクリーンアップするため、他の技術を使用した場合のような "スタック" (ロックファイルなど)。使用することができます

const http = require('http'); 

// create Sentinel server 
let server = http.createServer(function(req, res) { 
    res.send("ok"); 
}); 
// make sure this server doesn't keep the process running 
server.unref(); 

server.on('error', function(e) { 
    if (e.code === "EADDRINUSE") { 
     console.log("Sentinel server already running - can't run more than one instance"); 
     process.exit(1); 
    } else { 
     console.log(e); 
    } 
}); 

server.listen(8399, function() { 
    console.log("Sentinel server running") 
}); 

他の方式:

  1. ランニングの検索リストが
  2. アドオンもfind-process

あなたができるように

  • 使用をロックファイルを使用するプロセスこのようなポートの代わりに名前付きパイプを使用してください(Windowsでは以下のコードが有効)。* nixのドメインソケット:

    const http = require('http'); 
    const path = require('path'); 
    
    // create Sentinel server 
    let server = http.createServer(function(req, res) { 
        res.send("ok"); 
    }); 
    // make sure this server doesn't keep the process running 
    server.unref(); 
    
    server.on('error', function(e) { 
        if (e.code === "EADDRINUSE") { 
         console.log("Sentinel server already running - can't run more than one instance"); 
         process.exit(1); 
        } else { 
         console.log(e); 
        } 
    }); 
    
    server.listen(path.join('\\\\?\\pipe', 'myUniqueServerPipeName'), function() { 
        console.log("Sentinel server running") 
    }); 
    
  • +0

    ここにTCPが必要なのはなぜですか?そのポートが他のアプリによって利用されるとどうなりますか? Node.jsはローカルドメインソケットと名前付きパイプをサポートしています(Windowsの場合)。したがって、あなたは https://nodejs.org/api/net.html#net_server_listen_path_backlog_callback –

    +0

    @ c-smileを使うことができます。あなたはTCPを使う必要はありません。これは単なる相互運用性のものです。 – jfriend00

    +0

    ノードを強制的にシャットダウンすると、使用中のように見えるようにソケットがハングアップする可能性がありますか?ロックファイルは良いアイデアのようです。 – Anonymous

    関連する問題