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だって再起動で治ることが多いのはこういうことがバックグラウンドで起こっているためだ。

yuzuki
未整理記事