Edited at

rails s がうまく動かないときにやったこと

More than 3 years have passed since last update.

Ruby on Rails を使って開発していて、ある日突然 rails s しても立ち上がらなくなるときがあります。

実体験に基づいています。つらい。


rails server が立ち上がるけど何も反応しない

このケースは、

$ rails s

をしてもちゃんとサーバが立ち上がります。しかし、 localhost:3000 とかでアクセスしてみてもログが流れません。

当然、ブラウザには何も表示されない事態が起こります。

このときは

$ ps ax | grep httpd

とかしても apache が動いていることが確認できて、わりとはまりました。

このときは、/etc/hosts

127.0.0.1 localhost # IPv4

がなく、

::1 localhost # IPv6

はだけある状態だったので、 IPv4 の記述をしたところ動くようになりました。


すでに3000番ポートが使われてると怒られる場合。

このときは

$ rails s

とかすると、

adding listener failed addr=0.0.0.0:3000 (in use)

retrying in 0.5 seconds (4 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (3 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (2 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (1 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (0 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
Exiting
/Users/user_name/git/project/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.2/lib/unicorn/socket_helper.rb:185:in `bind': Address already in use - bind(2) for 0.0.0.0:3000 (Errno::EADDRINUSE)

こんな感じに怒られます。

この場合はたいてい他に rails server が立ち上がってたりするケースが多いので、もう一方の rails server を落とせばいいです。

しかし自分の場合は

$ ps ax | grep ruby

$ ps ax | grep rails

とかやっても実行中のプロセスが見つかりませんでした。

なので、lsof してオープンしてるプロセスをみてみると

$ lsof -i:3000

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
VBoxHeadl 91045 user_name 19u IPv4 0xda7db325f97a1df3 0t0 TCP *:hbci (LISTEN)

VirtualBox が生き残ってたようです。 vagrant haltしたのに

そんなわけで動いていた VM を終了させて無事 localhost:3000 でアクセスできるようになりました。

UNIXコマンド知らなさすぎてかなり遠回りしてしまった感があります。。

またいろいろと rails server 周りで嵌まるたびに追加していこうと思います。