rails s でローカルホスト3000を立ち上げようとした時に、「Address already in use」というエラーが出て起動ができない問題が派生しました。
その際に実施した解決法について備忘録としてまとめます。
以下エラー文です
Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)
翻訳すると、ローカルホスト3000は既に立ち上がっている。という意味なので、ターミナルを全て終了させたのですが、改善しませんでした。
エラーの原因としては、アプリの動作中にctrl cで強制終了させた事のようです。
その際に行った対処法は
①lsof -i:3000コマンドで、ローカルホスト3000を使用しているアプリを見る
②kill -9 PID番号で該当するPID番号のプロセスを終了させる
という手順です。
順番に説明します。
#「lsof -i:3000」 コマンド
まずはlsof -i:3000 コマンドを実行してローカルホスト3000を使用しているアプリを確認します。
% lsof -i:3000
実行してみると以下のような情報が出力されました。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 6455 user 14u IPv4 0xb13e455940b92b7 0t0 TCP localhost:hbci (LISTEN)
ruby 6455 user 15u IPv6 0xb13e455924f2e87 0t0 TCP localhost:hbci (LISTEN)
ruby 6455 user 27u IPv6 0xb13e455924f4707 0t0 TCP localhost:hbci->localhost:53230 (CLOSE_WAIT)
ruby 6455 user 30u IPv6 0xb13e455924f40e7 0t0 TCP localhost:hbci->localhost:53244 (CLOSE_WAIT)
実行結果としてPID:6455 が占有してしまっている事が分かります。
#「kill -9 PID番号」 コマンド
PID:6455を強制終了するために、kill -9コマンドを使います。
% kill -9 6455
実行して、rails sをすると無事にサーバーを立ち上げる事ができました。
#補足① 「lsof -i:3000」の意味
さて今回使った「lsof -i:3000」とはどのような意味なのでしょうか。
まず「lsof」は、オープンしているファイル一覧を示すコマンドです。
lsofコマンドは lsofには様々なオプションを指定する事ができます。
今回はオプションに ポート番号などを指定できる「-i」を指定しました。
従って「lsof -i:3000」とするとローカルホスト3000を指定できます。
*参考文献
lsofコマンドについて
https://atmarkit.itmedia.co.jp/ait/articles/1904/18/news033.html
#補足② 「kill -9 PID番号」の意味
killコマンドは実行しているプロセスを終了させるコマンドです。
続く「-9」はプロセスを強制終了させるオプションです。
今回は「kill -9 6455」とする事で、PID番号6455を強制終了させました。
*参考文献
killコマンドについて
https://eng-entrance.com/linux-command-kill
#まとめ
今回のエラーは、アプリの動作中にctrl cで強制終了させた事が原因でした。
対処法として、lsofコマンドでポート番号3000を参照して、killコマンドでプロセスを終了させました。