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)が過去にありましたが、その方法では解決しませんでした。
お手数ですが、ご助言よろしくお願いします。