ノード/エクスプレス:EADDRINUSE、アドレスはすでに使用中-サーバーを強制終了


442

接続を使用してnode.jsで実行している単純なサーバーがあります。

var server = require('connect').createServer();
//actions...
server.listen(3000);

私のコードには実際のハンドラーがありますが、それが基本的な考え方です。私が得続けている問題は

EADDRINUSE, Address already in use

以前にクラッシュまたはエラーが発生した後、アプリケーションを再度実行すると、このエラーが表示されます。ターミナルの新しいインスタンスを開いていないので、でプロセスを閉じますctr + z。

サーバーまたは接続を閉じるだけで十分です。運が悪いので電話server.close()しprocess.on('exit', ...);てみました。


39
実際には、代わりにSIGQUITを送信してプログラムを正しく終了Ctrl + zするCtrl + cを使用する必要があります:)詳細については、wikiを参照してください:)
— nacho4d

1
あなたはSIGINTを意味します。SIGQUITは `ctrl + \`によるものです
— Xedecimal

53
UNIXライクなOSで試してみるpkill nodejsかpkill nodeどうか
— Gerard

1
私は同様の問題を抱えていて、CTRL + Cで正常
— Jazzy

1
1.ぶら下がりまたはデッドプロセスIDがポートにラッチされているようです。そのため、ノードベースのサービスが起動せず、エラーPORT IN USE(ERROR ADDRESS IN USE)がスローされます。サーバーを再起動せずにポート10000。
— abksharma

回答:


146

process.on('exit', ..)プロセスがクラッシュまたは強制終了された場合は呼び出されません。場合にのみ、イベントループが終了すると呼ばれ、以来れるserver.close() の並べ替え、それが終了イベント内でこれを入れても意味がありません(それは現在もあちこちでスタックを実行するのを待つ必要があります)終了イベントループ...

クラッシュ、実行process.on('uncaughtException', ..)、および強制終了process.on('SIGTERM', ..)

そうは言っても、SIGTERM(デフォルトのkillシグナル)はアプリをクリーンアップさせますが、SIGKILL(即時終了)はアプリに何もさせません。


3
これは、process.on( 'SIGINT'、...)のフックにも役立ちます
— farincz

487

コマンドラインルートに移動することもできます。

ps aux | grep node

プロセスIDを取得します。

次に:

kill -9 PID

killで-9を実行すると、(SIGTERMではなく)SIGKILLが送信されます。SIGTERMは、ノードによって無視されることがあります。


1
ps aux | grep node何も示しません。それでもtextareaserver --editor-cmd='gvim -f'失敗:3月14日午後9時19分30秒を- socket.io準備-接続を受け入れることは、今でサーバを起動でした:EADDRINUSE、すでに使用中のアドレス
— ジャン・ヨルダン

75
なぜ、こののではなくkillall -9 node
— マーティンJosefsson氏

1
pidofも便利です
— JVE999 2014

25
:私は、このコマンドは(この例では8000)指定されたポート上で実行中のすべてのプロセスを強制終了します...そして1日は便宜上1つのライナーにそれを構成し、長い時間のためにこの回答を使用 lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
— lukejacksonn

1
私は複数のノードサーバーを同時に実行していました。その一部はElectronアプリです。のkill代わりに、特定のプロセスID のみを使用する必要がありましたkillall。
— tuliomir

225

まず、どのプロセスが使用しているかを知りたいでしょう port 3000

sudo lsof -i :3000

これにより、このポートでリッスンしているすべてのPIDが一覧表示されます。PIDを取得すると、次のように終了できます。

kill -9 {PID}

17
このコマンドは、の出力とは異なり、PIDを明確に識別ps aux | grep nodeします。私も必要ではありませんでしたsudo
— フィルギビンズ2018年

これが最良の答えです。ポート8081を使用すると、React Nativeと糸を使用して、問題なく動作しました。
— フェルナンドバルボサ

これは私にとってはうまくいきました。ポート3000が使用されていた場所を特定して、閉じることができました。私も必要ありませんでしたsudo。
— カンパロ

結構。コマンドを取得した後も試しました。killall -9 {COMMAND}例killall -9 node
— STREET MONEY

すごいですね
— Anoop PS

162

win8を実行しているラップトップでこれを押しました。これはうまくいきました。

「管理者」としてcmd.exeを実行します。

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

コマンドウィンドウから実行していて、誤って閉じてしまいました。ノードはバックグラウンドで実行され続けました...(セッションが終了した後でも)。私の場合、Webソケットを介して接続されているブラウザタブを閉じると、最終的に終了しました。
— Bertus Kruger、2015

6
taskkill /F /IM node.exeWindowsでは、どのディレクトリからでも魅力的に機能します:-)共有していただきありがとうございます!!
— Marty McGee 2015年

2
これは、Windowsで確認できた唯一の単一行作業ソリューションです
— コードウィスパー

4
Windows 10で動作します。cmd.exeを管理者として実行する必要はありませんでした。
— Glenn Werner

74

以下のコマンドを使用して、ポート3000で実行されているプロセスのPID、つまりIDを確認します。

lsof -i tcp:3000

それは次のようなものを出力します:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

次に、以下を使用してプロセスを終了します。

kill -9 5805

これは、slsオフラインプラグインを使用するときに私にとってはうまくいきました。
— Junaid Atique

これをありがとう!私は数時間前のように、反応を学び始めました。:)サーバーを停止した後、サーバーを再実行しましたが、そのようなエラーが発生しました。
— Glenn、

lostを使用すると、何も出力されません。これは、その部分にプロセスがないことを意味しますか?
— x89

42

私はこの解決策を見つけました、試してみてください sudo

  sudo pkill node

私はまだこのコマンドでノードプロセスを見ます:ps aux | grep node
— IgorGanapolsky

29

Linux

psノードプロセスのPIDを実行して決定します。

次に、実行します sudo kill PID

ウィンドウズ

tasklistを使用して、実行中のプロセスのリストを表示します。

tasklist /O

次に、(tasklistコマンドから取得したPIDを使用して)ノードプロセスを次のように強制終了します。

taskkill /pid PID

1
Windowsの場合はどうでしょうか。
— Trevor

1
ちょうどメモとして...何らかの理由でgit-bashからのtaskkillコマンドのフラグにダブルスラッシュを使用する必要があり、taskkill //IM node.exe ノードを強制 終了しました。働いた。
— nawlbergs 2017

23

これは1つのライナーです(3000をポートまたは構成変数に置き換えます)。

kill $(lsof -t -i:3000)

20

私は一度このエラーを受け取り、ここで多くのアプローチをとりました。

私の問題はapp.listen(3000);、同じapp.jsスクリプトで2つの呼び出しがあったことです。最初のapp.listen()は、2番目がエラーをスローしたところで成功しました。

デバッグに役立つ他の便利なコマンドsudo fuser -k 3000/tcpは、起動した不正なプロセスを強制終了することでした(たとえば、forever.jsで実行すると、一部のプロセスが再起動する場合がありますが、私にとっては便利でした)。


同じ問題がここにあります...実行中にこのエラーが発生する一方で、デバッグで正しく機能していたのは奇妙ですnpm start
— Asqan

16

Windowsの場合、タスクマネージャを開き、node.exeプロセスを見つけます。End Taskでそれらすべてを殺してください。

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


1
Windowsユーザーにとって非常に簡単で複雑ではあり
— ません

できます。ありがとう
— ナジャティ

14
ps aux | grep node
kill -9 [PID] (provided by above command)

説明:


  1. psはプロセスのステータスを示し、auxはリストを提供します。a:すべてのユーザープロセス、u:ユーザー自身のプロセス、x:端末に接続されていない他のすべてのプロセス。
  2. パイプ記号:| ps auxの結果を渡してさらに操作します。
  3. grepは、ps auxによって提供されたリストから提供された文字列(この場合はノード)を検索します。

12

参考までに、1つのコマンドでプロセスを強制終了できます sudo fuser -k 3000/tcp。これは、開発に一般的に使用される8000、8080、9000などの他のすべてのポートに対して実行できます。



11

まず、何を実行しているかを調べます。

sudo lsof -nP -i4TCP:3000 | grep LISTEN

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

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

その後、次のようにプロセスを終了できます。

sudo kill 110

その後、EADDRINUSE ::: 3000エラーをリッスンせずに実行できます。


nodemonを使用していますが、サービスを再起動します。ノードモンを殺す方法はありますか?
— Smit Patel、

10

私のような Visual Studio Noobsの場合

他の端末でプロセスを実行している可能性があります!

Visual Studioでターミナルを閉じた後、ターミナルが消えるだけです。

以前のものは破壊されたと考えて、新しいものを手動で作成しました。実際には、新しいターミナルをクリックするたびに、以前のターミナルの上に新しいターミナルを作成していました。

それで私は最初のターミナルを見つけて…ほら、そこでサーバーを走らせていました。

それを実現しない複数の端末


1
そうそう、私の兄弟。
— Jaydeep Shil

8

タスクマネージャ(Ctrl + Alt + Del)->

[プロセス]タブ->

「node.exe」プロセスを選択し、「プロセスの終了」をクリックします


ノードポートプロセスを強制終了するのが目的であるのに、なぜノードプロセス全体を強制終了するのですか。
— Jimmy Obonyo Abor 2016

8

スレッドまたはプロセスを強制終了しても実際にはアプリが終了しないシナリオに遭遇する場合があります(これは、LinuxとWindowsで時々起こります)。閉じていないインスタンスがすでに実行されている場合があります。

これらの種類の状況の結果として、私は以下に追加することを好みますpackage.json:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

次に、次のように呼び出します。

npm run stop-win
npm run stop-Linux

必要に応じて、より洗練された、引数フラグを使用してこれらのBINコマンドを作成できます。それらをtry-catch句内で実行されるコマンドとして追加することもできます。


5

Windowsユーザーの場合:ファイルを開いtask managerてend task、nodejs.exe問題なく動作します。


4

ホットノードを使用して、サーバーのクラッシュ/実行時エラーを防ぐことができます。ホットノードは、ノードプログラム[ソース] /プロセス[実行中のノードプログラム]に変更があるたびに、自動的にnodejsアプリケーションを再起動します。

グローバルオプションを使用してnpmでホットノードをインストールします。

npm install -g hotnode


pm2がより良い選択です。より堅牢でより多くのオプション。そして、永遠に持っているルートとして実行するときに問題はありません。
— Lucas 14

@ルーカスあなたが言う永遠の根本的な問題は何ですか?残念ながら、(ライセンスのがらくたが原因で)作業中の製品でpm2の代わりに永遠に使用することを余儀なくされており、これは非常に心配です!
— GPX

4

フォームのすべての回答を尊重して、ポイントを追加したいと思います。

Ctrl + Zを使用してエラーでノードアプリを終了すると、次に開こうとしたときに同じエラーEADDRINUSEが発生することがわかりました。

Ctrl + Cを使用してノードアプリを終了すると、次回それを開いたときに問題なく完了しました。

エラーのポート番号以外のポート番号に変更すると、問題が解決しました。


1
Ctrl + Cが正しいです。以前と同じポート番号を使用しましたが、以前と同じように機能しました。
— vipulnj 2017年

2
<key> Ctrl-Z </ key>はプロセスを停止しません。他のコマンドを実行できるように、バックグラウンドで配置します。これはUnixシェルのものです。プロセスを続行するにfgは、同じコンソールで使用します。次に、コマンドラインでさまざまなコマンドを入力した後、そのサーバーで何が起こっているかを確認できます。
— Alexis Wilke

4

Linuxの場合。

に関数を追加~/.bashrc:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

プル変更: source ~/.bashrc

そしてそれを使う: killTcpListen 3000


3

念のためこの行を複数回追加していないか確認してください

app.listen(3000, function() {
  console.log('listening on 3000')
});

上記のコードはエクスプレス用ですが、コードで同じポートを2回使用しようとしているかどうかを確認してください。


3

Win10、git bash v2.15、ノードv8.9.1、npm v5.5.1

ノードを起動するpackage.jsonスクリプトがありました: "start": "node index.js"

これを使用したときはいつでも、Ctrl + Cで強制終了したかどうかに関係なく、この問題に遭遇しました。

node index.js代わりにgit bashから実行しnpm run startてctrl + cで強制終了した場合、このエラーは発生しませんでした。

理由はわかりませんが、これが誰かの役に立つかもしれないと思いました。


1
基本的に同じ設定で同じ問題が発生します。私の場合、npmを介して高速アプリを実行すると2つのプロセスが生成されますが、ctrl + cを使用すると1つしか閉じられません。ノードのみでアプリを起動すると、開いているプロセスは1つだけで、正しく閉じます。
— 2017

1
このgit for windowsの問題は、全体に光を当てるようなものです。minttyとcygwinの依存関係のどこかにバグがあるようです。
— 2017

3

UIソリューションWindowsユーザーの場合:上位の回答がうまく機能しないことがわかりました。MacまたはLinuxユーザー向けのコマンドのようです。コマンドを覚える必要のない簡単な解決策を見つけました。タスクマネージャーを開く(Ctrl + Shift + Esc)。実行中のバックグラウンドプロセスを確認します。Node.jsを見つけてタスクを終了します。

これを行った後、問題は解消されました。他の回答で述べたように、以前にエラーが発生し、通常の終了/クリーンアップ関数が呼び出されなかったために実行中のバックグラウンドプロセスです。それらを強制終了する1つの方法は、タスクマネージャーでプロセスを見つけてそこで強制終了することです。 。ターミナル/ powerShellからプロセスを実行した場合、通常はctrl + cを使用してプロセスを強制終了できます。


はい、正解です。ありがとう
— DINA TAKLIT

3

私の答えで@Gerardのコメントを書き換えます:

試してみてくださいpkill nodejsまたはpkill node上の場合はUNIXライクな OS。

これにより、任意のポートで実行されているノードサーバーを実行しているプロセスが強制終了されます。私のために働いた。

ナマステ🙏


2

ノードはメモリ内のどこかで実行されており、そのポートがロックされています。Windowsでは、ほとんどのWindowsの問題と同様に、この問題はCTRL+ ALT+ DELを押すか、再起動することで解決されます。


この質問は他の多くの質問に答えます。オフにして、もう一度オンにします。天才。
— datUser 2016年

1

この問題の理由は次のとおりです。

  1. Skypeのように、このポートで1つのアプリケーションが実行されている可能性があります。
  2. ノードがクラッシュし、ポートが解放されていない可能性があります。
  3. サーバーを複数起動しようとした可能性があります。この問題を解決するには、ブール値を維持して、サーバーが起動しているかどうかを確認します。ブール値がfalseまたは未定義を返した場合にのみ開始する必要があります。

1

server.close()は接続を閉じるのに時間がかかるため、これを非同期呼び出しにする必要があります。

await server.close();

重要:awaitを使用する場合は、カプセル化関数でasyncキーワードを使用する必要があります。

async () => {
  await server.close();
}

1

ターミナル/コマンドで以下のコマンドを使用してポートを変更します(npm run devはnode.js用です)アプリを実行する他のコマンドを使用すると、ポートを変更しているときにほとんどのコマンドが機能し、簡単かつ高速になります。さらに、3002の代わりにシステムで空いている任意のポート番号を使用できます。

PORT=3002 npm run dev

突然終了したり、無意識のうちにプロジェクトを実行したりするときに、ポートを出てしまうControl + Zを押すと、ほとんどの場合、サーバーからプロジェクトを実行するためにポートから出ないControl + Cが常に実行されます。

さらに、コードのポート番号を変更する時が来ました

server.listen(3002);

0

これは、2つのノードサーバーが同じポートで実行されていることを意味します。1つがポートで実行されている場合は、3000で他のポートを別のポートに変更すると3001で、すべてが正常に機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.