環境
- 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 を複製した時に起きた?のかもしれない。