Rails server(以下、Rails s)に関する、バグが発生しましたので、内容と解決法を以下に纏めます。
皆様の参考になれば、幸いです。
#問題内容
-内容:
Rails sを再起動しようとしたところ、既にサーバーがあり起動できないという問題
-背景/詳細:
binding.pry使用中、exit!・ctrl+c等をコマンドしてもなぜかループから抜けられない。
=>ターミナルを消してrails sを再起動して使用を試みる。
=>既にサーバーがあるとの文言があり、起動できないとのこと。
以下のような状況でした。
rails s
=> Rails 5.0.7.2 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
A server is already running.
#解決方法
結論、lsofコマンドを使用し、該当のPIDをキルして解消しました。
詳細を以下に記載していきます。
##lsofコマンドを使用して状況を確認
今回はlocalhost:3000使用していたので、$ lsof -i:3000と記載してチェックします。
以下のように「34139」が既に存在していることがわかります。
このタスクが切れてないのが問題の原因であることが、明白になりました。
$ lsof -i:3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 34139
ruby 34139
##該当のPID番号をキルして解消
それでは上記で確認できたタスクを削除します。
$ kill 34139
*念のため、再度状況を確認。何も動いていない状況であることが確認できました。
これで、再度「rails s」を使用することができます。
*上記でまだプロセスを終了できていない場合は、以下のように「−9」を追記して試してみてください。
$ kill -9 34139
$ lsof -i:3000
###因みに。。lsofコマンドについて
今回使用したlsofコマンドについて、調べてみましたので、以下に記載しておきます。
詳細は参照ページを確認頂けますと幸いです。
オプション | 意味 |
---|---|
-a | 複数のオプションを指定した際に、AND(かつ)の意味で機能させる |
-P | ポート番号をサービス名に変換しない |
-c | プロセス名を指定する |
-i | ネットワークソケットファイルを指定する |
-n | IPアドレスを表示する(名前解決しない) |
-p | プロセスIDを指定する |
-u | ユーザー名を指定する |
項目 | 意味 |
---|---|
COMMAND | 実行されているコマンド名 |
PID | プロセスID |
USER | ユーザー名 |
FD | ファイルディスクリプタ |
TYPE | 種類 |
DEVICE | デバイス |
SIZE/OFF | ファイルサイズ |
NODE | iノード番号(プロトコル) |
NAME | ファイル |
以上となります。最後までご覧いただき、ありがとうございました!
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします!
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。
####参照
Linux基本コマンドTips一覧
https://www.atmarkit.co.jp/ait/articles/1904/18/news033.html