「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コマンドの種類・シグナルの使い方