1
1

More than 3 years have passed since last update.

" a server is already running" エラー対応の自動化(シェルスクリプト使用)

Posted at

エラーの原因

Dockerを使用して立ち上げたRailsコンテナのプロセスを「Ctrl + c」で強制終了し、「rails s」で再びサーバーを立ち上げようとすると" a server is already running" というエラーが発生することがあります。

原因は、pids/server.pid というファイルが残っていることです。手動ではありますが、コマンドラインで以下を実行すれば解決します。

rm tmp/pids/server.pid

毎回のように丁寧にDockerコマンドを入力すれば問題は発生しませんが、「Ctrl + c」で楽にサーバーを終了させたいというのが人間だと思います。しかし、エラーに怯え、エラーが発生した際に毎回手動対応することは大変に面倒なので、削除を自動化するシェルスクリプトを書きます。

まずは、Railsアプリのあるディレクトリに「delete-server-pid.sh 」というファイルを作成します。以下のコマンドを実行しても良いです。

touch delete-server-pid.sh 

作成したファイルにシェルスクリプトを書きます。

#!/bin/sh
set -e

if [ -f tmp/pids/server.pid ]; then
 rm tmp/pids/server.pid
fi

exec "$@"

次にコマンドラインで以下を実行し、パーミッションを設定します。

chmod +x delete-server-pid.sh

あとは、Railsのために用意されたDockerfileに作成したシェルスクリプトを実行するように設定します。

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
ENTRYPOINT [​ "./delete-server-pid.sh " ​] 
CMD ​​ ["bin/rails", "s", "-b", "0.0.0.0"] ​ 

これで、server.pidがあれば削除されるように自動化されました。

参考書籍/参考資料

コード自体はこちらに書かれています。
https://stackoverflow.com/questions/35022428/rails-server-is-still-running-in-a-new-opened-docker-container

書籍ですが、シェルスクリプトの詳しい解説はこちらにあります。
https://www.amazon.co.jp/Docker-Rails-Developers-Applications-Everywhere/dp/1680502735

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1