背景
Next.jsの開発サーバを起動させると以下のようなエラーが発生し、開発サーバが起動しなかった。
(node:internal/process/task_queues:91:21) {
errno: -48,
code: 'EADDRINUSE',
syscall: 'bind',
address: '::1',
port: 8080
}Next.jsの開発サーバを起動させると以下のようなエラーが発生し、開発サーバが起動しなかった。
(node:internal/process/task_queues:91:21) {
errno: -48,
code: 'EADDRINUSE',
syscall: 'bind',
address: '::1',
port: 8080
}これは、ポート8080がすでに別のプロセスに使われていることが原因である。
Error: bind EADDRINUSE ::1:8080
code: 'EADDRINUSE'
port: 8080EADDRINUSE = "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を実行し、何も表示されなければポートは解放されている。その後、開発サーバを立ち上げ直すと問題なく起動した。