はじめに
こんにちは、かずやです。
この記事を読んでいる方は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のエラーを解消できるかなと思います。
参考になれば幸いです。
コメント