【Rails】起動時・再起動時のエラーを二つのコマンドとプロセス番号で解消する。


はじめに

Railsをローカル環境内で実行する時に起動にエラーが発生する場合があります。
この場合は、プロセス番号でrailsを停止する事が可能です。
コマンドを二回うつだけでrailsの起動に関する問題を解決できます。

【 control + C 】でrailsを停止しようとしても反応がしない。
ターミナル再起動したけど 【A server is already running.】により起動することができない。
そんな時に新規ターミナルで強制終了することができます。

環境やバージョンにより実行が異なる場合があります。

実行環境

pc: macOS Catalina
shell: zsh
rails: 6.0.0
ruby: 2.7.2

railsを起動や再起動しようとし、以下のコマンドを実行しエラーになった。

% rails s
=> Booting Puma
=> Rails 6.0.3.4 application starting in development 
=> Run `rails server --help` for more startup options
A server is already running. (省略)

こちらはrailsのサーバーを起動した状態で、
「ターミナルを終了してしまった。」や「control + Cで終了し再起動した。けど...ダメだ。」
この様なエラーは様々です。

早速コマンドを実行して起動を終了します。
まず以下のコマンドを実行しプロセス番号を取得します。

% lsof -i tcp:3000  もしくは  lsof -wni tcp:3000 
 
COMMAND  PID   USER       FD   TYPE                     DEVICE SIZE/OFF NODE NAME
ruby     7361  UserName   12u  IPv6 0x310cb952b8b0dc9d  0t0  TCP localhost:hbci (LISTEN)
ruby     7361  UserName   13u  IPv4 0x310cb952bbe4ce0d  0t0  TCP localhost:hbci (LISTEN)

次にプロセス番号(PID)を取得できたら以下のコマンドでrailsの停止をする事ができます。
この場合であれば,7361がプロセス番号です。

% kill PID もしくは kill -9 PID

以上でrails sで起動してくれるのではないでしょうか。

解説

lsof -i 

lsofは開いているファイルなどを取得するコマンド
-iはやプロセス番号やポート番号を検索し取得するlsofのオプション
-wniは-iと役目は変わりません。

lsof -i tcp:3000

上記のコマンドでもプロセス番号を取得することは可能なのですが、多くの情報を取得してしまいます。
そうなると探し出すのが大変になるので、local で以下の様にすることで情報を限定するとピンポイントで取得する事ができます。

「ローカル3000で起動しているプロセス番号と使用ファイルの情報を取得」となります。
killコマンドはプロセスにシグナルを送るコマンド

kill -9 プロセス番号

もしくは

kill -i プロセス番号

−9はオプション・シグナルと呼ばれるます。
以下のコマンドは「起動中のプロセス番号に停止する」となります。

一言

僕も知識はまだまだです。
何か誤りがあれば訂正いたしますので、
新しい情報もあれば宜しくお願いいたします。