From 072885bbf89fa0039ed0ed1aab42072848eac46b Mon Sep 17 00:00:00 2001 From: evazion Date: Sat, 10 Aug 2019 02:57:32 -0500 Subject: [PATCH] delayed jobs: run dj workers under systemd (fix #4108). --- lib/capistrano/tasks/delayed_job.rake | 33 +++++++++------------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/lib/capistrano/tasks/delayed_job.rake b/lib/capistrano/tasks/delayed_job.rake index 4109a9a8d..f14838436 100644 --- a/lib/capistrano/tasks/delayed_job.rake +++ b/lib/capistrano/tasks/delayed_job.rake @@ -2,11 +2,11 @@ namespace :delayed_job do desc "Start delayed_job process" task :start do on roles(:worker) do - if test("[ -d #{current_path} ]") - within current_path do - with rails_env: fetch(:rails_env) do - hostname = capture("hostname").strip - execute :bundle, "exec", "script/delayed_job", "--queues=default,#{hostname}", "-n 8", "start" + within current_path do + with rails_env: fetch(:rails_env) do + fetch(:delayed_job_workers, 16).times do |n| + bundle = SSHKit.config.command_map[:bundle] + execute :"systemd-run", "--user --collect --slice delayed_job --unit delayed_job.#{n} -E RAILS_ENV=$RAILS_ENV -p WorkingDirectory=$PWD -p Restart=always #{bundle} exec script/delayed_job --queues=default run" end end end @@ -16,36 +16,25 @@ namespace :delayed_job do desc "Stop delayed_job process" task :stop do on roles(:worker) do - if test("[ -d #{current_path} ]") - within current_path do - with rails_env: fetch(:rails_env) do - execute :bundle, "exec", "script/delayed_job", "stop" - end - end - end + execute :systemctl, "--user stop delayed_job.slice" end end desc "Restart delayed_job process" task :restart do on roles(:worker) do - find_and_execute_task("delayed_job:stop") - find_and_execute_task("delayed_job:start") + execute :systemctl, "--user restart delayed_job.slice" end end - desc "Kill delayed_job process" - task :kill do + desc "Show status of delayed_job process" + task :status do on roles(:worker) do - procs = capture("ps -A -o pid,command").split(/\r\n|\r|\n/).grep(/delayed_job/).map(&:to_i) - - if procs.any? - execute "for i in #{procs.join(' ')} ; do kill -s TERM $i ; done" - end + # systemctl exits with status 3 if the service isn't running. + execute :systemctl, "--user status delayed_job.slice", raise_on_non_zero_exit: false end end end -after "delayed_job:stop", "delayed_job:kill" before "deploy:started", "delayed_job:stop" after "deploy:published", "delayed_job:start"