Golang における bind: address already in use を解決する

環境

  • AWS EC2 AmazonLinux2023
  • Golang 1.23
  • Supervisor 4.2.5

bind: address already in use

go run やデーモン化するために supervisor を起動したら、
下記エラーが出た。

$ go run main.go
.
.
.
[GIN-debug] Listening and serving HTTP on :8080
[GIN-debug] [ERROR] listen tcp :8080: bind: address already in use

ポート番号が被っていると出るエラーで、
どこでそのポード番号を使用しているか調べる必要がある。

解決

今回、困ったのが、
go run もしていないし、 supervisor も起動していないのに、
該当のポート番号を使用しているアプリケーションが実行されていた事。

もちろん該当ポートはそのアプリケーションでしか使用していない。

試しに supervisor を実行すると、
アプリケーションがエラーを起こしてしまって常駐できない。

$ sudo supervisord -c /etc/supervisord.conf

# FATAL になってる。RUNNING になれば正常
$ sudo supervisorctl status
go-app-sample            FATAL   Exited too quickly (process log may have details)

# エラーが出る
$ sudo supervisorctl start go-app-sample
go-app-sample: ERROR (spawn error)

supervisor のログを見ると、
同じく bind: address already in use エラーだった。

その1:ポート番号でプロセスを確認する

今回の件では解決できなかったけど、
ポート番号から実行しているプロセスを確認できる。

$ sudo lsof -i :8080
COMMAND     PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
main    1045678 ec2-user    6u  IPv6 42872440      0t0  TCP *:blp3 (LISTEN)

プロセスを停止する。

$ sudo kill -9 1045678

が、何故か自動的にプロセスが起動してしまい、
停止できなかった。

その2:プロセスを確認する

今回の件はこちら。
supervisor を起動していないのに何故かプロセス上では実行されていた。

$ sudo ps aux | grep supervisord
root      678910  0.0  0.5 247904 20196 ?        Ss   Sep11   0:14 /usr/bin/python3 /usr/local/bin/supervisord -c /etc/supervisord.conf

このプロセスを停止して、
何故か実行されてた supervisor で動いていたアプリケーションも停止する。

$ sudo ps aux | grep main
root      678999  0.0  0.2 1528748 9720 ?        Sl   Sep11   0:00 /var/www/html/your/project/app/main

停止する。

$ sudo kill -9 678910
$ sudo kill -9 678999

原因

こちらで supervisor を起動していないのに、
何故か動いていて、それが邪魔をして bind: address already in use が出ていた。

思いつくところで言えば、
AWS で EC2 を複製した時に起きた?のかもしれない。