##はじめに
EC2で次のようにunicorn接続を行った際に起こり、接続できなかったので、そのエラー理由と対処法を備忘録として残しておきます。
[ec2-user@ip-10-0-0-133 twitter_clone_2019]$ bundle exec unicorn_rails -E development -c config/unicorn/development.rb -D
master failed to start, check stderr log for details
##このエラーは何か??
check stderr log for details
(詳細はstderrlogを確認するように)とあるので調べてみると以下のような結果が出ました。ここで注目するのがAlready running on PID:17739
となります。unicornは接続する度にプロセスIDが割り当てられます。そのため、このエラーは以前に行ったunicorn接続のプロセスが残っており、それが実行中のため再度接続できません、という意味です。
[ec2-user@ip-10-0-0-133 twitter_clone_2019]$ sudo vi log/unicorn.stderr.log
bundler: failed to load command: unicorn_rails (/var/www/twitter_clone_2019/vendor/bundle/ruby/2.6.0/bin/unicorn_rails)
ArgumentError: Already running on PID:17739 (or pid=/var/www/twitter_clone_2019/shared/tmp/pids/unicorn.pid is stale)
/var/www/twitter_clone_2019/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:207:in `pid='
/var/www/twitter_clone_2019/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:139:in `start'
/var/www/twitter_clone_2019/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/bin/unicorn_rails:209:in `<top (required)>'
/var/www/twitter_clone_2019/vendor/bundle/ruby/2.6.0/bin/unicorn_rails:23:in `load'
/var/www/twitter_clone_2019/vendor/bundle/ruby/2.6.0/bin/unicorn_rails:23:in `<top (required)>'
##エラー対処法
unicornを再起動させたり、停止させたい場合は、動作中のプロセスに対してkill
というシグナルを送信することででプロセスを停止させることができます。ec2-user 17978
等がプロセスになります。これらの動作中のプロセスを停止させた後、grepと書かれているプロセスのみ残っていればOKです。これで、unicorn接続を改めて行うことが可能となります。
[ec2-user@ip-10-0-0-133 twitter_clone_2019]$ ps aux | grep unicorn #プロセスの確認
ec2-user 17978 5.4 7.3 776516 74064 ? Sl 14:14 0:00 unicorn_rails master -E development -c config/unicorn/development.rb -D
ec2-user 17985 0.0 6.6 776516 66500 ? Sl 14:14 0:00 unicorn_rails worker[0] -E development -c config/unicorn/development.rb -D
ec2-user 17986 0.0 6.6 776516 66500 ? Sl 14:14 0:00 unicorn_rails worker[1] -E development -c config/unicorn/development.rb -D
ec2-user 18020 0.0 0.0 119484 896 pts/1 S+ 14:14 0:00 grep --color=auto unicorn
[ec2-user@ip-10-0-0-133 twitter_clone_2019]$ kill 17978 #プロセスの停止
[ec2-user@ip-10-0-0-133 twitter_clone_2019]$ ps aux | grep unicorn #再度プロセスの確認
ec2-user 18023 0.0 0.0 119484 936 pts/1 S+ 14:16 0:00 grep --color=auto unicorn
上記の方法だと、毎回停止させるプロセス番号の確認が必要となりますが、以下の方法だと確認作業を省略することができます。-3
は中止シグナルとなっており、バッククオート内で実行されているプロセスを停止させることができるコマンドです。
[ec2-user@ip-10-0-0-133 twitter_clone_2019]$ kill -3 `cat shared/tmp/pids/unicorn.pid` #unicorn.pidがあるpathをバッククオートで囲む
##参考資料
https://wa3.i-3-i.info/word11040.html
https://qiita.com/Coconew5/items/2f4ba976e58da9c1ec22
https://www.k-tanaka.net/unix/kill.php