はじめに
こんにちは、かずやです。
この記事を読んでいる方はaddress already in use
というエラーのせいでサーバーが起動できずお困りかと思います。
本記事ではこのエラーの解決方法を順を追って説明します。
記事のとおりにコマンドを実行していけば上記のエラーを解決しサーバーを起動できるようになるはずです。
Goを題材としていますが、言語は無関係なので気にせず読んでいただければ幸いです。
エラー内容
go run main.go
を実行しサーバーを起動しようとした際に、以下のエラーが発生しました。
go-sample $ go run main.go
2025/01/12 09:33:51 listen tcp :8080: bind: address already in use
exit status 1
このエラーは指定したポート8080番が他のプロセスで使われているため、サーバーが起動できないことを示しています。
解決方法
以下の3ステップでこのエラーを解消できます。
- 使用中のプロセスの特定
- 特定したプロセスを終了
- サーバーを再起動
①使用中のプロセスの特定
まずはlsof
コマンドで指定したポート(今回は8080番)を使用中のプロセスを特定します。
go-sample $ lsof -i :8080
今回の場合、出力結果は次のようになりました。(USERは改変しています)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
main 7774 hogehoge 3u IPv6 0xdcd2eb56d26155ff 0t0 TCP *:http-alt (LISTEN)
PID:7774
のプロセスがすでに8080番のポートを使っているようです。
②特定したプロセスを終了
①で特定したプロセスを終了させるためにkill
コマンドを実行します。
go-sample $ kill -9 <PID>
この記事の例だと終了させたいプロセスのPIDは7774
なのでkill -9 7774
を実行すればOKです。
コマンドを実行しても特に何も出力されませんが、それで問題ありません。
③サーバーを再起動
ここまでできたら、サーバーを再起動してみましょう。(今回の場合はgo run main.go
を再び実行)
無事に起動できるはずです。
エラーの原因
過去にgo run main.go
で起動したサーバーを終了させずにターミナルを閉じてしまった結果、起動中のままプロセスが残存してしまっていました。
雑にターミナルを閉じず、先に⌘ + C
でサーバーを停止させてからターミナルを閉じるようにすると良さそうです。
まとめ
address already in use
はポート番号の競合を意味しているlsof
でポートを使用中のプロセスを特定しkill
コマンドで終了させれば解消できる- サーバーを停止せずにターミナルを閉じてしまうと、このエラーが発生しがち
記事の手順に沿ってコマンドを実行していけばaddress already in use
のエラーを解消できるかなと思います。
参考になれば幸いです。
コメント