【ターミナル】ターミナル強制終了後、rails sしたらA server is already runningとなった時の対処法【Rails】


「controll+z」でサーバーを切ったら、rails sが効かなくなった。どうしよう・・という問題。

【バージョン】

Rails 5.2.4.3
Ruby 2.5.1
macOS Catalina 10.15.4

【経緯】

ローカルで作業中、rails sで立ち上げたlocalhost:3000を「controllキー + c」でサーバを切り、再度「rails s」で起動させようとしたらうんともすんともいわず・・・ほかの切り方がないか調べたところ「controllキー + z」で強制終了できることが判明。

しかし、「controllキー + z」で強制終了後、
再度、rails sで立ち上げたところ、localhost:3000が立ち上がらず、下記のエラーが出た。

ターミナル
A server is already running. Check /Users/名前/XXX/XXXXXX/tmp/pids/server.pid.

「サーバーはすでに起動しています」と言われた。

【解決方法】

なので、

ターミナル
% lsof -i:3000

でどんなプロセスが動いているのかを確認してみる。

lsofコマンド
…「LiSt Open Files」(開いているファイル群を列挙する)という言葉に由来するようです。その名の通り、「プロセスが開いているファイル」を表示するコマンドらしいです。



ターミナル
COMMAND  PID            USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    6792 satokokinoshita   11u  IPv4 0x95b341c28591923f      0t0  TCP localhost:hbci (LISTEN)
ruby    6792 satokokinoshita   22u  IPv6 0x95b341c27813ce6f      0t0  TCP localhost:hbci (LISTEN)



実際の画面はこんな感じだった

ここで、COMMANDがrubyとなっているPIDの番号 (ここだと6792、下の画面だと3405) を、○に入れる。

ターミナル
% kill -9 〇〇〇〇



これで、rails sで再度起動できるようになりました。

※ちなみにkillコマンドについてはkill -9(強制終了)以外は試しておりません。

localhost:3000のサーバーを切った時に消えるはずのプロセスが、強制終了したことで一部残ってしまっていたのだと思います。

「PID(プロセスアイディー)」は、プロセスを識別するための一意の数字になりますが、
PIDを指定してkillコマンドで切ることで、サーバーを切った状態に戻ったということになったのだと思います。

【参考にさせていただいたサイト】

このポートで実行中のプロセスはどれ? lsofコマンドの使い方

プロセスを止める最終手段killコマンドの種類・シグナルの使い方



【当該エラーに直面した時の感想的な】

Railsの画面に表示されるエラーは慣れたけど、ターミナルのエラーってあまりないので変な汗がでました😅
ターミナルコマンドはどんどん慣れていきたいです。