ターミナルを閉じずにサーバーを止めた時
処理をしている時、サーバーを止めずにターミナルを閉じると以下のエラーが出ます。
Address already in use - bind(2) for "0.0.0.0" port 3000」
A server is already running. Check /Users/taro/git/hello_world_rails/tmp/pids/server.pid.
Exiting
のようなエラーが出ます。
この状態だと control + c
でサーバーを止めても、処理は続いていることになります。
現在動いてるプロセスを確認する
サーバーが動いている時、プロセスID
というものがあります。
これを下のコマンドで調べる必要があります。
$ lsof -i:3000
⚫︎補足
3000はポート番号です。
ポート番号の説明は下の記事から確認してください。
そうすると下のような表示が出ます。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 70515 taro 13u IPv4 0xdf4c50ba54cadac7 0t0 TCP localhost:hbci (LISTEN)
ruby 70515 taro 15u IPv6 0xdf4c50ba63f7e187 0t0 TCP localhost:hbci (LISTEN)
上ののPID 70515
がプロセスIDです。このIDは毎回変わります。
サーバーを停止する方法
下のコマンド実行します。
$ kill 70515
これでサーバーが止まります。番号は毎回変わるので注意してください。
もし上のやり方で止まらない場合は-9を使ってください。強制オプションです。
kill -9 70515
下のコマンドで止まったか確認できます。
$ ps -ax | grep ruby
コンテナ内に入ってしまった時
今この状態です。
% make bash
docker compose run --rm api bash
bash-5.1# lsof -i:3000
1 /bin/bash 0 /dev/pts/0
1 /bin/bash 1 /dev/pts/0
1 /bin/bash 2 /dev/pts/0
1 /bin/bash 255 /dev/pts/0
bash-5.1# bundle exec rails s
=> Booting Puma
=> Rails 7.0.8 application starting in development
=> Run `bin/rails server --help` for more startup options
A server is already running. Check /opt/app/tmp/pids/server.pid.
Exiting
このようにrailsサーバー起動しません。その時に以下のやり方で対処しました。
まずlsof -i:3000
の結果からは、ポート3000を使用しているプロセスが表示されていません。
しかし、rails sを実行した際に
A server is already running. Check /opt/app/tmp/pids/server.pid. Exiting
というメッセージが表示されており、サーバーが既に起動していると判断されています。
rm tmp/pids/server.pid
サーバーが正しく停止されなくてserver.pidファイルが残っている可能性があったので。
手動で削除してから再度rails sを試してみました。
その後に
docker compose down
docker compose up -d
などで再起動しました。後ブラウザが更新されていなかったので更新しました。(これが原因かは不明ですが)
参考資料