エラーの修正方法:nodejsの使用中にEADDRINUSEをリッスンしますか?


466

ポート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();

options.portが80として定義されていますか?XHRコードはブラウザーで実行されていますか?このサーバーが実行されていないときに「nc -l 0.0.0.0 80」を実行できますか?
ティモシーミード


どのシステムを使用していますか?特定のしきい値を下回るポートをリッスンする場合、一部のシステムではsudoが必要です。
Kebman

この問題は、そのポートでサーバーを実行していて、そのポートを閉じていなかったために発生します。エラーは、ポートがすでに使用されていることを明らかに示しています。これは、他のプロジェクトを閉じずに新しいプロジェクトをvsコードで開いたときですドラッグアンドドロップで)
アシャドナシム

回答:


412

EADDRINUSElisten()サーバーをバインドしようとするポート番号がすでに使用されていることを意味します。

したがって、あなたのケースでは、すでにポート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);

1
このサーバーだけを実行します。サーバーを起動する前に、xmlhttprequestが機能します。ポート80でサーバーを起動すると、サーバーも完全に動作します。しかし、サーバーの起動後にxmlhttprequestを実行すると、このエラーが発生します。
ダニーフォックス

6
サーバーがすでにリッスンしている場合でも、これはエラーをスローしませんか?
トリシス

1
私にとってこれはSkypeが原因でした
Beep

559

私にとって本当に役に立ったのは:

killall -9 node

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

ps ax

機能したかどうかを確認できます。


1
私にとっても。私の場合、リッスン機能を2回実行しただけで、2番目にエラーが発生しました
vabada

2
関連するノートでは、プロセスをkil -9してはならない場合にも読むことができます
のび太

12
ここでの問題は、最初の実行後にノードプロセスが正常に終了しないことです。したがって、ノードはまだそのポートにバインドされています。ps aux | grep nodeそれを示すでしょう。CTRL + Zでアプリケーションを強制終了する代わりに、CTRL + Cでアプリケーションを終了します。これにより、アプリケーションが正常に終了し、ポートバインディングが削除されます。
ライザー101

22
ソフトウェアを槌で打つことに相当するソリューションに対する150以上の賛成票。
LeeGee 2016年

1
-9フラグはメモリを解放せずにプロセスを強制終了するため、この解決策は非常に問題があります。これは最後の解決策としてのみ使用してください。
焼きクライン

279

前述のkillall -9 nodeは、Patrickによって提案され、期待どおりに動作し、問題を解決しますが、なぜこれkill -9が最善の方法ではないのかについて、この非常に答えの編集部分を読むことをお勧めします。

さらに、すべてのアクティブなプロセスを盲目的に強制終了するのではなく、単一のプロセスをターゲットにすることもできます。

その場合、最初にそのポートで実行されているプロセスのプロセスID(PID)を取得します(たとえば8888)。

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を使用してノードコマンド(またはその他のコマンド)を終了します。実行中のプロセスを停止する正しい方法は、クリーン終了を実行するCTRL + Cコマンドを発行することです。

正しい方法でプロセスを終了すると、シャットダウン中にそのポートが解放されます。これにより、プロセスを再実行する前に、自分でプロセスを強制終了することなくプロセスを再開できます。


このコマンドはどこで実行すればよいですか?コマンドプロンプトで?NPMコンソールで?
Ulysses Alves

@UlyssesAlvesはターミナルウィンドウを開いて、そこからプロセスを強制終了します。
のび太

@のび太これはWindowsで動作しますか?今、私はそれがMAC OSコマンドかもしれないことに気づきました。とにかく、私はPCを再起動しましたが、このエラーはもう発生しませんでした。他のアプリケーションが同じポートノードを使用していたと思います。
Ulysses Alves

2
pgrep nodeノードプロセスが実行されているかどうかを示します。pkill node全殺します。
Josh.F 2016

3
Windowsではありません-人々-別のポートを試すか、コンピュータを再起動する必要があります:P
トムスティッケル

62

ちなみに、Skypeはポート80をリッスンすることがあるため、Node.jsまたは他のアプリからポート80をリッスンしようとすると、このエラーが発生します。

オプションにアクセスし、[詳細設定]-> [接続]-> [ポート80を使用]をクリックして、Skypeでの動作をオフにすることができます(これを選択解除します)

Skypeポート80の使用をオフにする

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


14
PSその変更を行った後、Skypeを再起動することを忘れないでください!
Rob Evans

16
これは、私が今まで見た中で最も驚異的な設計上の欠陥の1つです。Skype開発者が80や443を超えること検討しているとしたら、どれほど狂気なのでしょうか。
AJB 2015

5
ロブ、デバッグスキルに大きな+1を。
AJB 2015

@AJB彼らは、アウトバウンドトラフィックをhttpリクエストに制限するファイアウォールを通過しようと試みましたが、ファイアウォールがDPIを使用していないので、基本的なポートブロックを実行してください。それでも...これをデフォルトで有効にするのは少しばかげています!
Rob Evans

ええ、なぜ彼らがこれを行うのかを少し考えた後、それは私に起こりました。それでも、本当に醜いクラッジ。そして、それがデフォルトで有効になっているという考えは、単なる傲慢です。
AJB 2015

39

ポート80でリッスンしているプロセスを強制終了してみてください。

Killallは実行中のすべてのノードアプリを強制終了します。あなたはそれをしたくないかもしれません。このコマンドを使用すると、既知のポートでリッスンしている1つのアプリのみを強制終了できます。

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

sudo fuser -k 80/tcp    

1
やきありがとう。killallノードは私にとって失敗しましたが、これはうまくいきました。
Pat M

ありがとう!killall lsof -iは私にとってはうまくいきませんでしたが、これはうまくいきました。
カルフス2016年

1
実行中のすべてのノードアプリを強制終了したくない場合があります。
Yaki Klein

28

エラーの理由:ビジーを使用しようとしていますport number

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

あなたもウィンドウに1つのコマンドで行うことができますnetstat -ona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /f
Z. Khullah

27

コントローラー環境下では、以下を使用できます。

pkill node スクリプトを実行する前に、ジョブを実行する必要があります。

このコマンドはすべてのnodeプロセスを強制終了することに注意してください。つまり、コンテナが1つのインスタンスのみを実行している場合は、これが正しい可能性があります。

その他のシナリオでは、コマンドを使用して、プログラムで探した特定のプロセスIDまたはプロセス名を強制終了することをお勧めします。プロセスが呼び出された場合のように、node-server-1で実行できますpkill node-server-1

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


2
pgrep node少し注意しnodeて実行中のプロセスを確認したい場合は、
事前に

1
完全に!、それがプロセスのコンテナーまたは非常に制御された場所である場合に備えて話していました。
Javier Cobos 2017年

これは、上記で提供された他の回答よりも素晴らしい回答です。皆さん投票してください。
Jitendra Pawar

@JavierCobos:コンテナーまたは同様の管理されたスペース内で話していた場合は、その情報を回答自体に追加してください。多くの人々はそのような環境、特に開発マシンではないので、これは意図しない結果をそのままもたらす可能性があります。反対票を投じますが、適切な説明を付けて投票を変更できます。
lindes

1
多くの人がそうするでしょう...しかし、ジュニア開発者のトレーニングを支援するためにかなりの時間を費やす誰かとして、そしてそのコンテキストを超えてさえ、私は非常に多くの人々が実際に何をしているかを理解せずにStack Overflowの答えを利用していると言えるでしょう。 ..彼らは問題に直面しているだけであり、何かが彼らの問題であると思われるものに対する解決策として表されている何かを見て、彼らはそれで実行します。だから...私は個人的にサイトが良い説明をして、良い一般的な習慣を育てることを望みます。だから、私はそこから来ています。しかし、それだけが視点ではないことはわかっています。:)
lindes

16

アプリケーションはすでにそのポート8080で実行されています。このコードを使用してポートを強制終了し、コードを再度実行します

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

質問は8080ではなくポート80を参照しています。また、これはおそらくポート8080で問題のあるプロセスを取り除くために機能しますが、使用することkill -9はほぼ間違いなく過剰であり、私の意見では、特定の警告なしに与えるべきひどいアドバイスですそれ。ジャストはkill、おそらくトリックを行うだろう、と本当に、この問題の根本的な問題は、彼らが再実行しようとしていることを、私が思うに、あるサーバーこれが唯一のハックではなく、修正ですので、何度も繰り返し。彼らは何が起こっているのかをよりよく理解する必要がありますが、この答えは実際には提供していません。
リンデス

15

このエラーを引き起こす可能性のあるもう1つのことは、同じノードコード内の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')); 
});                                                                   

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


14

これは私にとってはうまくいきます(私は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

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

たとえば、ノードアプリケーションを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ユーザー向けのソリューションです。


9
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

3
今後の読者がコード/コマンドを理解できるように、回答にコンテキストを追加してください。
ミロ

8

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

強制殺害のため

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

上記のコマンドを使用して特定のポートを強制終了し、サーバーを実行します


8

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

killall 9 node
pkill node
npm start 

1
このハックは私を助け、時間を大幅に節約しました
Anoop PS

5

このエラーは、アプリケーションを実行するポートでプロセスが実行されている場合に発生します。

そのポートで実行されているプロセスを取得する方法=>コマンド:sudo netstat -ap | grep:3000

出力:そのポートを使用しているプロセス情報を取得します

tcp 0 0 IPaddress :3000 LISTEN 26869 / node

今、あなたはそのプロセスを殺すことができますsudo kill -9 26869


すべての回答を確認しました。しかし、あなたは私の問題を解決します。
Rahul、


5

EADDRINUSEは、nodejsアプリのポートがすでに使用されていることを意味します。

  • これで、そのポートで実行されているプロセス/アプリが強制終了されました。
  • 次の方法でアプリのプロセスIDを見つけます。

lsof -i tcp:3000

  • これで、これからプロセスIDが取得されます。
  • これを実行してください:

kill -9 processId


4

タスクマネージャを使用してプロセスを終了する方法があります。

このソリューションはWindows専用であることに注意してください

  1. タスクマネージャーに移動します(またはショートカットCtrl+ Shift+ を使用Esc)。

  2. 「バックグラウンドプロセス」で「Node.js」プロセスを見つけて終了します(右クリックして「タスクの終了」を選択します)

ここに画像の説明を入力してください

  1. 今、あなたは再び始めることができるはずです

Macユーザーの場合:1.「アクティビティモニター」を起動します。2.右上の検索バーで「ノード」を検索します。3.ノードプロセスをダブルクリックして終了します。準備万端です!!!!ハッピーコーディング。
アポジー

3

このエラーはhttp.clientで(ノード内で)以前に見たことがあります。思い出すと、問題は、httpClientを初期化しないか、httpClientの作成やURLリクエストで不正なオプションを設定しないことでした。


3

私も同じ問題を抱えており、単にターミナルを閉じて新しいターミナルを開いて実行します

node server.js

再び。それは私にとってはうまくいきますが、それが再びうまくいくまで数秒待つ必要がある場合もあります。

ただし、これはサーバーコンソールではなく、開発者のマシンでのみ機能します。


3

エラー:listen EADDRINUSEは、アプリケーションサーバーに割り当て/バインドするポートがすでに使用されていることを意味します。別のポートをアプリケーションに割り当てることができます。

または、同じポートをアプリに割り当てたい場合。次に、目的のポートで実行されているアプリケーションを強制終了します。

ノードアプリケーションの場合は、次の方法でノードアプリのプロセスIDを確認できます。

ps -aux | grep node

プロセスIDを取得した後、

kill process_id

Windows 10の-aux?
トムスティッケル2017

-auxはLinuxベースのシステム用ではありません。Windowsベースのシステムの場合、目的のノードプロセスのシステム監視を検索して終了できます。
Parth Vyas 2017

2

Debianでは、ポート80で実行することがわかったため、rootとしてコマンドを発行する必要があります。

sudo node app.js

それが役に立てば幸い


2

私の場合、Apache HTTP Serverはポート80で実行されていました。ルートとしてコマンドを発行して解決しました

sudo killall httpd

更新

JenkinがMacにインストールされて実行されている場合。

  1. あなたはそれをチェックすることができます sudo lsof -i tcp:8080
  2. はい、Jenkinsを1回だけ停止する場合は、次のコマンドを実行します。 sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

2

別のNode ng serveプロセスが実行されているようです。コンソール(Linux / Mac)で次のように入力して確認します。

ps aux|grep node

そしてそれで終了します:

kill -9 <NodeProcessId>

または代替使用

ng serve --port <AnotherFreePortNumber>

選択した無料のポートでプロジェクトを提供します。


1

NODE_PORTを強制終了するときに、同じポートをリッスンしているChromeプロセスまたは何かを強制終了する可能性があり、それは煩わしいことです。

このシェルスクリプトは役立つかもしれません-私の場合、ポートは1337ですが、いつでも変更できます

# LOGIC

CHROME_PIDS=`pidof chrome`
PORT_PIDS=`lsof -t -i tcp:1337`

for pid in $PORT_PIDS
do

if [[ ${CHROME_PIDS} != *$pid* ]];then

    # NOT FOUND IN CHROME PIDS

    echo "Killing $pid..."
    ps -p "$pid"

    kill -kill "$pid"
    fi

done

sails lift
# OR 'node app' OR whatever that starts your node

exit

1

私の場合、私はWebホスティングを使用していますが、ローカルホストでも同じです。

ps -aef | grep 'node' 

次に、ノードプロセスを監視するために、コンソールにPIDのプロセスが表示されます。プロセスを強制終了するには、次のコマンドを使用する必要があります。

kill -9 PID

ここで、PIDは上記のコマンドのプロセスIDです。


1

2つのサーバーが同じポートでリッスンできないため、他のサーバーが同じポートでリッスンしているかどうかを確認し、同じポートで実行されている場合はブラウザーの同期も確認してください


1

ノードがlocalhostあり、80ではなく3500のようなポートで実行されているWindows 10の他の人々のために...

機能しないもの:

killall    ?  command not found
ps -aux | grep 'node'     ?     ps:  user x unknown 

情報は表示されるが機能しないもの:

 ps -aef | grep 'node'
 ps ax
 kill -9 61864

機能するもの:

WindowsでのGit BashまたはPowershell

  net -a -o | grep 3500   (whatever port you are looking for) 

PID(右端)
に注意してくださいkillall

  1. タスクマネージャーを開く
  2. [プロセス]タブで、[名前]または任意の列を右クリックし、PIDを含めることを選択します
  3. PIDで並べ替え、右のPIDを右クリックして、タスクの終了をクリックします。

その後、Windowsでそれほど楽しくない演習を行った後、タスクマネージャを使用してノードエンジンを見つけて終了できることに気付きました。

ちなみに、私はVisual Studio Codeを使用してノードをポート3500で実行しており、VSコード内でGit Bashシェルを使用しています。Ctrl + Cで正常に終了しましたが、これで強制終了されない場合があります。これを機能させるために、ポートを変更したり再起動したりしたくありません。うまくいけば、それは他の人を助ける。それ以外の場合は、自分用のドキュメントです。


1

Windowsユーザーの場合、PowerShellウィンドウで次のコマンドを実行して、すべてのノードプロセスを強制終了します。

Stop-Process -processname node

1

私のために働いているオプション:

実行:

ps -ax | grep node

次のようなものが得られます:

 8078 pts/7    Tl     0:01 node server.js
 8489 pts/10   S+     0:00 grep --color=auto node    
 kill -9 8078
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.