unicornでRailsのサーバーが2回目以降立ち上がらない!!

ブログ始めたはいいけど、全然記事書いてなかったのでたまにはと思い書いてみます。

 

私は今TECH::EXPERTというプログラミングスクールに通っていて、カリキュラムの中でunicornを使ってRailsのサーバーの立ち上げをしたのですが、1回目は上手くいったのに2回目はすぐにコマンドが終了してしまう・・・というエラーに悩まされたので、それについて書いていきます。

 

unicornRailsのサーバーが立ち上がらない・・・

原因は色々あるみたいですが、私の場合はこちらの記事に書いてある通りでした。

https://qiita.com/Coconew5/items/2f4ba976e58da9c1ec22

ただ、ここにたどり着くまでに苦労したことがあったのでそれを記事として残しておこうと思います。

 

lessコマンドでlog/unicorn.stderr.logの中身を確認する

カリキュラム通りにunicornの設定をするとlog/unicorn.stderr.logにエラーを記録する設定になっているそうなので、以下のコマンドを実行しました。

$ less log/unicorn.stderr.log

 そうすると以下のように色々と表示されます。

I, [2019-06-10T07:29:21.273529 #22256]  INFO -- : Refreshing Gem list
I, [2019-06-10T07:29:23.574423 #22256]  INFO -- : listening on addr=/var/www/アプリ名/tmp/sockets/unicorn.sock fd=10
I, [2019-06-10T07:29:23.574613 #22256]  INFO -- : listening on addr=0.0.0.0:3000 fd=11
E, [2019-06-10T07:29:23.575034 #22256] ERROR -- : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error::ConnectionError)
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect'
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `new'
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `mysql2_connection'
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:729:in `new_connection'
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:773:in `checkout_new_connection'
/home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7:

〜〜〜

しかし、これの見方が私にはよくわかりませんでした。唯一分かっていたのが4行目のEで始まる部分。この行がエラーを表しています。これはまだ最初の数行なのですが、わかる部分がそこしかないので他の部分は特に見ずにここに書いてある「Can't connect to local MySQL server through socket」をひたすら調べました。
こちらのエラーはmySQLに関するエラーなのですが、既にカリキュラムの方で解決していたはずのものなので「何でまた・・・」と思いながら色々と試しました。
しかし、何をやってもサーバーが立ち上がることはありませんでした。

 

catコマンドで確認する

「これはもうメンターさんを頼るしか・・・」と諦めかけた時、カリキュラムの中に「lessコマンドかcatコマンドでunicorn.stderr.logを確認する」と書いてあるのを見つけ、catコマンドを試してみようと思い以下のコマンドを実行しました。

$ cat log/unicorn.stderr.log

そうしたらlessで表示した時には見つけられなかった[Argument error]となっている行を発見しました。残念ながらその時のエラー文を残していないのですが、「〇〇〇〇・・・ 長々と書かれている何かのパス 〇〇〇〇[Argument error]」となっていました。そこで「〇〇〇〇[Argument error]」を丸々コピペして検索してみたところ、上記の記事を見つけ見事解決・・・といきたいところなのですが、ここでも少し引っかかってしまいました。

 

ps aux | grep unicornコマンド

上記記事を参考にps aux | grep unicornコマンドでunicornのプロセスを確認してみました。そうしたら以下のように表示されました。

ec2-user xxxxx ...
ec2-user xxxxx ...

「xxxxx」の部分には数字が書いてあります。

そして、記事によるとこの中のどれかのxxxxxのプロセスが残ってしまっているということでした。しかしどれが残ってしまっているプロセスなのかよくわからずまたしばらく悩んでしまい、他の原因を探り始めてまた解決への道から遠ざかってしまいました。
当然解決策は見つからず、途方に暮れながら何となく[Argument error]の部分を眺めていると、偶然解決への糸口を見つけることができました。

 

答えは[Argument error]の先頭部分にあった

[Argument error]の部分を先頭からよくみてみると、どこかでみたような数字が書いてあり、それが「既に実行済みですよ」のようなニュアンスの英語が書いてありました。もしかしてと思ってps aux | grep unicornの結果をみてみると、同じ数字を見つけ、「これだ!」と思って以下のコマンドを実行しました。

$ kill -9 xxxx

xxxxの部分には先ほど見つけた数字が入ります。

そうしたら無事にサーバーを立ち上げることができました!

 

まとめ

結局のところ、[Argument error]の冒頭部分の〇〇〇〇のところに全て書いてあったということですね。

エラー文はしっかり読まないといけないなーと思いました。