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 周りで嵌まるたびに追加していこうと思います。