零弐壱蜂

Error: bind EADDRINUSE ::1:8080でportが利用されているときの対処方法

背景

Next.jsの開発サーバを起動させると以下のようなエラーが発生し、開発サーバが起動しなかった。

(node:internal/process/task_queues:91:21) {
  errno: -48,
  code: 'EADDRINUSE',
  syscall: 'bind',
  address: '::1',
  port: 8080
}

環境

  • Next.js

原因

これは、ポート8080がすでに別のプロセスに使われていることが原因である。

Error: bind EADDRINUSE ::1:8080
code: 'EADDRINUSE'
port: 8080

EADDRINUSE = "Error: ADDRess IN USE"。なお、errno: -48はmacOSにおけるEADDRINUSEのエラー番号である。

ポートを別プロセスが握っているため失敗していた(8080番ポートの二重起動が原因)。

npm run dev が正常終了せずプロセスが残っている、あるいは別ターミナルで起動済みというシチュエーションのときに発生しうる。私の場合は、起動している形跡がなく、プロセスが残っているようだった。

対処

以降のコマンドの8080は、自分の環境のエラーメッセージに出たportの値に読み替える(Next.jsのデフォルトポートは3000)。

何が8080ポートを握っているか確認する。

lsof -i :8080

出力例は以下の通りである。PID列の値(この例では12345)を控える。NAME列のhttp-altはポート8080の別名である。

COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    12345 user   23u  IPv6 0xabcd1234ef567890      0t0  TCP localhost:http-alt (LISTEN)

特定したPIDのプロセスを終了させる。killは終了要求(SIGTERM)を送り、それでも終了しない場合だけ強制終了(SIGKILL)のkill -9を使う。

# PIDを直接指定
kill <PID>

# 効かなければ強制終了
kill -9 <PID>

# ワンライナーでまとめる場合(-tでPIDだけを出力し、xargsでkillに渡す)
lsof -ti :8080 | xargs kill -9

再度lsof -i :8080を実行し、何も表示されなければポートは解放されている。その後、開発サーバを立ち上げ直すと問題なく起動した。

参考