ウェブサイト検索

javascript - NodeJS を使用しているときに Error: listen EADDRINUSE を修正する方法は?


もし私がポート80でサーバーを運営していて、XMLHttpRequestを使用しようとすると、次のエラーが発生します: Error: listen EADDRINUSE

もしポート80でサーバーを実行している間にリクエストを行いたい場合、なぜNodeJSにとってそれが問題なのでしょうか?ウェブブラウザにとっては問題ではありません:サーバーが動作している間でもインターネットを閲覧できます。

サーバーは次の通りです:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

そしてリクエスト:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    sys.puts("State: " + this.readyState);

    if (this.readyState == 4) {
        sys.puts("Complete.\nBody length: " + this.responseText.length);
        sys.puts("Body:\n" + this.responseText);
    }
};

xhr.open("GET", "http://mywebsite.com");
xhr.send();

回答 #1

私に本当に役立ったのは次のことです:

killall -9 node

しかし、これはシステムプロセスを終了させます。

〜と一緒に

ps ax

それがうまくいったか確認できます。

回答 #2

EADDRINUSE は、listen() がサーバーをバインドしようとするポート番号がすでに使用中であることを意味します。

つまり、あなたの場合、すでにポート80でサーバーが動作しているに違いありません。

もしこのポートで別のウェブサーバーが動作している場合は、Node.jsをそのサーバーの背後に置き、それを通してプロキシする必要があります。

サーバーが本当に待ち受けているか確認するために、このようにlisteningイベントをチェックするべきです:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);

回答 #3

前述の killall -9 node は、パトリックによって提案されたもので、期待通りに動作し問題を解決しますが、kill -9 が最良の方法でない理由について、この回答の編集部分を読むことをおすすめします。

その上、すべてのアクティブなプロセスを盲目的に終了させるのではなく、単一のプロセスを対象にしたいかもしれません。

その場合、まずそのポート(例えば8888)で動作しているプロセスのプロセスID(PID)を取得します:

lsof -i tcp:8888

これは次のようなものを返します:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

それならただ実行してください(ps - 実際には実行しないでください。以下を読み続けてください):

kill -9 57385

ここでこれについてもう少し読むことができます。

追記:今日はかなり関連するトピックについて読んでいて、「なぜプロセスを kill -9 してはいけないのか」という興味深いスレッドに出くわしました。

一般的に、対象のプロセスに自分自身を整理する機会を与えるために、kill -9の前にkill -15を使用するべきです。(プロセスはSIGKILLをキャッチしたり無視したりすることはできませんが、SIGTERMはキャッチすることができ、しばしばキャッチします。)プロセスに作業を完了し整理する機会を与えない場合、再起動後に理解できない壊れたファイル(またはその他の状態)を残す可能性があります。

したがって、前述のように、上記のプロセスを次の方法で終了する方がよいです:

kill -15 57385

編集 2:ここで何度もコメントで指摘されているように、このエラーはプロセスを正常に終了しなかったことの結果です。つまり、多くの人が CTRL+Z を使って node コマンド(または他のコマンド)を終了しています。実行中のプロセスを停止する正しい方法は、正常な終了を行う CTRL+C コマンドを発行することです。

プロセスを正しい方法で終了すると、シャットダウン中にそのポートが解放されます。これにより、自分でプロセスを終了させる手間をかけることなく、再度プロセスを再起動することができます。

回答 #4

ちょっとした注意ですが、Skypeは時々ポート80で待ち受けることがあり、そのためNode.jsやその他のアプリケーションでポート80を使おうとするとこのエラーが発生することがあります。

Skypeでその動作をオフにするには、オプションにアクセスし、詳細設定 -> 接続 -> ポート80を使用(チェックを外す)をクリックします

追伸。その変更を行った後、Skypeを再起動するのを忘れないでください!

回答 #5

ポート80でリスニングしているプロセスを終了させてみるべきです。

Killall は実行中のすべての node アプリを終了させます。おそらくそれはしたくないでしょう。このコマンドを使うと、既知のポートでリッスンしている特定のアプリだけを終了させることができます。

UNIXを使用している場合は、このコマンドを試してください:

sudo fuser -k 80/tcp    

回答 #6

エラーの理由: 使用中の ポート番号 を使用しようとしています

Windows/Mac向けの2つの可能な解決策

  1. 現在使用されていないポート番号
  2. 現在のプログラムのために別のポート番号を選択してください

1. 使用中のポート番号を解放/終了する

ウィンドウズ

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

マック

netstatを試すことができます

netstat -vanp tcp | grep 3000

OSX El Capitan以降(またはnetstatが-pをサポートしていない場合)は、lsofを使用してください

sudo lsof -i tcp:3000

もしこれで問題が解決しない場合は、Mac ユーザーはこの問題に関する完全な議論を参照できます。Macでポート3000をロックしているプロセスを見つけて(そして終了させて)ください。

2. ポート番号を変更する

ウィンドウズ

set PORT=5000

マック

export PORT=5000

回答 #7

コントローラ環境では、次のように使用できます:

スクリプトを実行する前に pkill node を実行すれば、うまくいくはずです。

このコマンドはすべての node プロセスを終了させることを覚えておいてください。これは、例えば一つのインスタンスだけを実行しているコンテナや、そのように保証できる環境であれば適切かもしれません。

他のいかなる場合でも、プログラムで探して見つけた特定のプロセスIDや名前を終了するためのコマンドを使用することをお勧めします。例えば、プロセス名が node-server-1 の場合、pkill node-server-1 とすることができます。

このリソースは理解するのに役立つかもしれません:https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/

回答 #8

lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID 
kill PID 
ex: kill 129393

回答 #9

このエラーを引き起こすもう一つの原因は、同じノードコード内で2つのHTTPサーバーを立てていることです。私はExpress 2のコードをExpress 3に更新していて、これがありました…

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});        

// tons of shit.

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});                                                                   

そして、それがこのエラーを引き起こしました。

回答 #10

これは私にとってうまくいきます(私はMacを使っています)。このコマンドを実行してください

lsof -PiTCP -sTCP:LISTEN

これは、システムが使用しているポートのリストを表示します。あなたのノードが実行しているPIDを見つけてください

COMMAND     PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node      17269 hientrq   16u  IPv6 0xc42959c6fa30c3b9      0t0  TCP *:51524 (LISTEN)
node      17269 hientrq   19u  IPv4 0xc42959c71ae86fc1      0t0  TCP localhost:1337 (LISTEN)

そして kill -9 [YOUR_PID] を実行します

回答 #11

あなたのアプリケーションはすでにポート8080で実行されています。このコードを使ってポートを停止し、もう一度コードを実行してください

sudo lsof -t -i tcp:8080 | xargs kill -9

回答 #12

EADDRINUSE は、(Node アプリケーションでリッスンしようとしている)ポートがすでに使用されていることを意味します。これを解決するためには、そのポートでどのプロセスが実行されているかを特定する必要があります。

例えば、私たちがノードアプリケーションを3000番ポートで待ち受けようとしている場合、そのポートがすでに他のプロセスによって使用されていないかを確認する必要があります。

ステップ1:

$sudo netstat -plunt |grep :3000

上記のコマンドが以下の結果を与えるということ。

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

ステップ2:

さて、プロセスID(25315)を取得しました。そのプロセスを終了してください。

kill -9 25315

ステップ3:

npm run start

注意:これはLinuxユーザー向けの解決策です。

回答 #13

sudo kill $(sudo lsof -t -i:80)

フォースキルのために

sudo kill -9 $(sudo lsof -t -i:80)

上記のコマンドを使って特定のポートを停止してから、サーバーを起動してください

回答 #14

両方のコマンドを試すと、すべてのノードプロセスが停止します。

killall 9 node
pkill node
npm start 

関連記事