サーバー起動時に発生するaddress already in useの解決方法

目次

はじめに

こんにちは、かずやです。

この記事を読んでいる方は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ステップでこのエラーを解消できます。

  1. 使用中のプロセスの特定
  2. 特定したプロセスを終了
  3. サーバーを再起動

①使用中のプロセスの特定

まずはlsofコマンドで指定したポート(今回は8080番)を使用中のプロセスを特定します。

go-sample $ lsof -i :8080

lsofコマンドは List Open Files の略で、「どのプロセスがどのファイルを開いているか?」を表示するコマンドです。

今回の場合、出力結果は次のようになりました。(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です。

-9強制終了を表すオプションです。

コマンドを実行しても特に何も出力されませんが、それで問題ありません。

③サーバーを再起動

ここまでできたら、サーバーを再起動してみましょう。(今回の場合はgo run main.goを再び実行)

無事に起動できるはずです。

エラーの原因

過去にgo run main.goで起動したサーバーを終了させずにターミナルを閉じてしまった結果、起動中のままプロセスが残存してしまっていました。

雑にターミナルを閉じず、先に⌘ + Cでサーバーを停止させてからターミナルを閉じるようにすると良さそうです。

まとめ

  • address already in useはポート番号の競合を意味している
  • lsofでポートを使用中のプロセスを特定しkillコマンドで終了させれば解消できる
  • サーバーを停止せずにターミナルを閉じてしまうと、このエラーが発生しがち

記事の手順に沿ってコマンドを実行していけばaddress already in useのエラーを解消できるかなと思います。

参考になれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

未経験でSESから従業員300名以上の自社開発企業に転職しました。業務や個人開発で直面した問題や、転職・学習の経験を発信していきます。

コメント

コメントする

目次