
go runコマンドでポート競合が起きた時の対処法
go runと実行した時にポートが既に使用中でアプリが起動できないことがある。
$ go run main.go
[ERRO] 2019/11/02 14:41 listen tcp :8080: bind: address already in use
このようになってしまった場合は指定されているポートが何で専有されているかを確認する必要がある。
その際に役立つコマンドがlsofコマンドである。
今回のように8080がすでに使用されていると出た場合は下記のように使用する。
$ sudo lsof -i:8080
main 2170 ubuntu 3u IPv6 24710 0t0 TCP *:http-alt (LISTEN)
上記のような場合は8080がubuntuユーザーによってプロセスIP 2170で使用されているとわかる。
基本的にはそのプロセスが不要であれば
$ sudo kill -9 PID
とでプロセスを落とせばよい。
ただ、場合によっては落としたプロセスがすぐに立ち上がってしまう、そしてそのプロセスは正常に動作しないこともある。
本来ならば、プロセス同士の依存関係などを探って、親子プロセスから落としていくと解決することもあるが、許されるのであれば
$ sudo reboot
でサーバーを再起動してしまうと解決することが多い。
少々乱暴ではあるが、Windowsだって再起動で治ることが多いのはこういうことがバックグラウンドで起こっているためだ。