capistranoでrailsアプリをデプロイ中、unicorn:restartでkill exit status: 1エラー
受付中
回答 1
投稿
- 評価
- クリップ 1
- VIEW 2,399
capistranoでrailsアプリをAWSサーバーにデプロイする際、以下のエラーが発生しました。
お分かりになる方、何卒アドバイスいただければと思います。
環境
Ruby 2.6.0
Rails 5.2.0
Capistrano 3.11.0
AWS linux
Nginx
Unicorn
発生しているエラー
$ bundle exec cap production deploy を実行すると、unicorn:restartの部分で以下のエラーが出ます。
00:56 unicorn:restart
01 kill -s USR2 $(< /var/www/donosake_app/shared/tmp/pids/unicorn.pid)
01
01 Usage:
01 kill [options] <pid|name> [...]
01
01 オプション:
(略)
01
01 For more details see kill(1).
#<Thread:0x00007ffc03b9bae8@/Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/runners/parallel.rb:10 run> terminated with exception (report_on_exception is true):
Traceback (most recent call last):
10: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute'
9: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/backends/abstract.rb:29:in `run'
8: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/backends/abstract.rb:29:in `instance_exec'
7: from /Users/odatakashi/Web_Apps/donosake/lib/capistrano/tasks/unicorn.rb:51:in `block (3 levels) in <top (required)>'
6: from /Users/odatakashi/Web_Apps/donosake/lib/capistrano/tasks/unicorn.rb:22:in `reload_unicorn'
5: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/backends/abstract.rb:78:in `execute'
4: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/backends/abstract.rb:145:in `create_command_and_execute'
3: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/backends/abstract.rb:145:in `tap'
2: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/backends/abstract.rb:145:in `block in create_command_and_execute'
1: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/backends/netssh.rb:169:in `execute_command'
/Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/command.rb:99:in `exit_status=': kill exit status: 1 (SSHKit::Command::Failed)
kill stdout: Nothing written
kill stderr: Usage:
kill [options] <pid|name> [...]
オプション:
(略)
For more details see kill(1).
1: from /Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/runners/parallel.rb:11:in `block (2 levels) in execute'
/Users/odatakashi/Web_Apps/donosake/vendor/bundle/ruby/2.6.0/gems/sshkit-1.18.0/lib/sshkit/runners/parallel.rb:15:in `rescue in block (2 levels) in execute': Exception while executing as odatakashi@52.199.254.34: kill exit status: 1 (SSHKit::Runner::ExecuteError)
kill stdout: Nothing written
kill stderr: Usage:
kill [options] <pid|name> [...]
オプション:
(略)
For more details see kill(1).
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as odatakashi@52.199.254.34: kill exit status: 1
kill stdout: Nothing written
kill stderr: Usage:
kill [options] <pid|name> [...]
オプション:
(略)
For more details see kill(1).
(以下略)
unicorn.pidをkillできないということは理解できますが、原因が分かりません。
関係がありそうな箇所
[config/deploy.rb]
lock "3.11.0"
set :application, "donosake_app"
set :repo_url, "git@github.com:TakashiOda/donosake_app.git"
set :branch, 'master'
set :deploy_to, "/var/www/donosake_app"
set :linked_files, fetch(:linked_files, []).push('config/settings.yml')
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')
set :linked_files, %w{config/master.key}
set :unicorn_pid, "/var/www/donosake_app/shared/tmp/pids/unicorn.pid"
set :keep_releases, 5
set :ssh_options, {
user: "odatakashi",
keys: %w(~/.ssh/DonoSake_Key.pem)
}
set :rbenv_ruby, '2.6.0'
set :log_level, :debug
namespace :deploy do
desc 'Restart application'
task :restart do
invoke 'unicorn:restart'
end
desc 'Create database'
task :db_create do
on roles(:db) do |host|
with rails_env: fetch(:rails_env) do
within current_path do
execute :bundle, :exec, :rake, 'db:create'
end
end
end
end
desc 'Run seed'
task :seed do
on roles(:app) do
with rails_env: fetch(:rails_env) do
within current_path do
execute :bundle, :exec, :rake, 'db:seed'
end
end
end
end
after :publishing, :restart
after :restart, :clear_cache do
on roles(:web), in: :groups, limit: 3, wait: 10 do
end
end
end
[lib/capistrano/tasks/unicorn.rb]
namespace :unicorn do
task :environment do
set :unicorn_pid, "/var/www/donosake_app/shared/tmp/pids/unicorn.pid"
set :unicorn_config, "/var/www/current/config/unicorn/production.rb"
end
#unicornをスタートさせるメソッド
def start_unicorn
within current_path do
execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D"
end
end
#unicornを停止させるメソッド
def stop_unicorn
execute :kill, "-s QUIT $(< #{fetch(:unicorn_pid)})"
end
#unicornを再起動するメソッド
def reload_unicorn
execute :kill, "-s USR2 $(< #{fetch(:unicorn_pid)})"
end
#unicronを強制終了するメソッド
def force_stop_unicorn
execute :kill, "$(< #{fetch(:unicorn_pid)})"
end
#unicornをスタートさせるtask
desc "Start unicorn server"
task start: :environment do
on roles(:app) do
start_unicorn
end
end
#unicornを停止させるtask
desc "Stop unicorn server gracefully"
task stop: :environment do
on roles(:app) do
stop_unicorn
end
end
#既にunicornが起動している場合再起動を、まだの場合起動を行うtask
desc "Restart unicorn server gracefully"
task restart: :environment do
on roles(:app) do
if test("[ -f #{fetch(:unicorn_pid)} ]")
reload_unicorn
else
start_unicorn
end
end
end
#unicornを強制終了させるtask
desc "Stop unicorn server immediately"
task force_stop: :environment do
on roles(:app) do
force_stop_unicorn
end
end
end
[config/unicorn/production.rb]
root = "/var/www/donosake_app/current"
working_directory root
pid "/var/www/donosake_app/shared/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.log"
stdout_path "#{root}/log/unicorn.log"
listen "/var/www/donosake_app/current/tmp/sockets/unicorn.sock"
timeout 30
#ホットデプロイをするかしないかを設定
preload_app true
#fork前に行うことを定義。後述
before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
old_pid = "#{server.config[:pid]}.oldbin"
if old_pid != server.pid
begin
Process.kill "QUIT", File.read(old_pid).to_i
rescue Errno::ENOENT, Errno::ESRCH
end
end
end
#fork後に行うことを定義。後述
after_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
試したこと
サーバの/sharedに権限を与えたり、capistrano logを見ましたが、同じエラー内容しか書かれていません。また手動でプロセスをkillしましたが、それでも変わりません。
似たような質問(https://teratail.com/questions/147833)が過去にありましたが、その方法では解決しませんでした。
お手数ですが、ご助言よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
問題自体の解決になっているのかは不明ですが、
/var/www/app/shared/tmp/pids/uniorn.pidのファイル自体を削除すると、デプロイ自体は完了できました。
ちなみに削除する前のunicorn.pidファイル内は空っぽでした。削除したからkillコマンドがkillする対象が無くなったため、「とりあえず」処理が通ったのか、削除することが必要条件だったのかは不明です。
原因がお分かりになる方、教えてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
matsuand
2019/01/19 13:03
"SSHKit::Runner::ExecuteError" を検索してみたらどうでしょう?
TakashiOda
2019/01/20 00:46
Matsuandさま
理解が追いつかず申し訳ないのですが、それはGoogleでという意味ですか?それとも内部でエラーログのさらなる詳細を検索する方法があったりするのでしょうか?もしあれば教えてください。
matsuand
2019/01/20 07:28
Google で検索するという助言です。一般的には内部エラーログがあればそれも含みます。今の場合、内部エラーログが該当するかどうかは当方は承知していません。Google かエラーログか、どちらを調べるのか解釈できないとお考えになる前に、どちらでも良いから手当たり次第行動を起こして、あらゆる手を尽くして調べ倒してください。
TakashiOda
2019/01/20 12:48
ご回答ありがとうございます。
実は、わかる限りのエラーログに加え、Googleで英語も含めて3日間調べ尽くしたのですが、解決に至らなかったために質問を投稿しました。
もちろん初学者でかつ独学なので調べ方や、capistrano自体の仕組みを完全に理解できていないことも大きいことも、対処できない理由だと思われます。
それでもいまだに解決しないため、もし何かしらお分かりになられるのであればご教授ください。
よろしくお願いいたします。
matsuand
2019/01/20 13:13 編集
pid ファイルが /var/www/donosake_app/current 配下になく shared 配下ですが、これはアクセス権限的に問題ないですか? kill -s USR2 にエラーが出ていて、エラーの出方がいわゆる構文誤りです。"kill -s USR2" という文字面には誤りがありませんから、後は $(< /var/www/donosake_app/shared/tmp/pids/unicorn.pid) が怪しいとなります。怪しいとは、そのファイルが存在しない、ディレクトリが存在しない、それらは存在するがアクセスできない、といった理由が想像されます。
TakashiOda
2019/01/20 14:38
pidファイルはshered配下にあります。アクセス権的には問題ありませんでした。またkillコマンドの文面も誤りはありませんでした。
理由は分かりませんが、shared/tmp/pids/unicorn.pidを削除したところうまくいきました。昨日同じことをやってもうまく行かなかったのですが・・・
ですがアドバイスを元に良く考えたら、おっしゃる通り今回のエラーはkillコマンドの構文が間違っていることが原因ですよね。。
ですがその部分を何も変えないままうまく行ってしまいました。さらにわからなくなってしまいました。
デプロイ自体はうまく行ったのですが、なんだかモヤモヤします。
いずれにしても、killコマンドをはじめ、一連のコマンドの書き方や意味をもう少し深く知る必要があると気づかされました。コメントいただきましてありがとうございました。
matsuand
2019/01/20 15:20
とりあえず解決してなによりと思います。追記しますが pid ファイルが存在しなかったりアクセス権限がなかったりしたら、別のエラーになっているかもしれません。考えられる可能性として、pidファイルは存在するものの中身が空っぽ (process id が書かれていない) 場合です。空であれば kill 構文が成立しないことになります。ではなぜそうなったかは不明です。異常処理が発生したとしか思いつきません。