私は開発中のnode.jsアプリケーションを持っています。私がテストしたところ、同じアプリケーションの2つのインスタンスが誤って実行されたことが判明し、いくつかの悪影響をもたらしました。node.js内の同じアプリケーションのマルチインスタンスを拒否する方法は?
これを防ぐ方法を教えてください。おそらく、私のアプリが既に実行されているかどうかを確認する方法があります。もしそうなら、エラーを投げてシャットダウンしてください...
多くの方が助けてください!
私は開発中のnode.jsアプリケーションを持っています。私がテストしたところ、同じアプリケーションの2つのインスタンスが誤って実行されたことが判明し、いくつかの悪影響をもたらしました。node.js内の同じアプリケーションのマルチインスタンスを拒否する方法は?
これを防ぐ方法を教えてください。おそらく、私のアプリが既に実行されているかどうかを確認する方法があります。もしそうなら、エラーを投げてシャットダウンしてください...
多くの方が助けてください!
既知のポートにローカルサーバーを作成する単純なクロスプラットフォームスキームがあります。その後、今後のインスタンスは同じサーバーを作成しようとし、別のインスタンスが既に実行されているため失敗します。
このようなサーバーを使用する利点の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")
});
他の方式:
あなたができるように
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")
});
ここにTCPが必要なのはなぜですか?そのポートが他のアプリによって利用されるとどうなりますか? Node.jsはローカルドメインソケットと名前付きパイプをサポートしています(Windowsの場合)。したがって、あなたは https://nodejs.org/api/net.html#net_server_listen_path_backlog_callback –
@ c-smileを使うことができます。あなたはTCPを使う必要はありません。これは単なる相互運用性のものです。 – jfriend00
ノードを強制的にシャットダウンすると、使用中のように見えるようにソケットがハングアップする可能性がありますか?ロックファイルは良いアイデアのようです。 – Anonymous
同じポートを2回使用している場合は、エラーが表示されます。 EADDRINUSEを聞く。どのポートを実行していますか? – andrewgi
まあ、私は、node.jsがクライアントであるサーバーとしてpythonを使用しています – Anonymous
https://stackoverflow.com/questions/171213/how-to-block-running-two-instances-of-the-same-program#171220これは一般的な解決策です。 – Malice