При перезапуске delayed_job с capistrano не всегда создается файл pid - PullRequest
2 голосов
/ 27 февраля 2012

При подключении к веб-серверу я могу перезапустить delayed_job весь день без проблем.Он останавливает существующего работника, запускает нового и записывает tmp / pids / delayed_job.pid со своим идентификатором процесса.(Я также перезапускаю пассажира, чтобы имитировать то, что я собираюсь сделать с капистрано)

app@StagingServer:/app/current$ touch tmp/restart.txt; RAILS_ENV=staging script/delayed_job restart
delayed_job: trying to stop process with pid 22170...
delayed_job: process with pid 22170 successfully stopped.
delayed_job: process with pid 22284 started.
app@StagingServer:/app/current$ touch tmp/restart.txt; RAILS_ENV=staging script/delayed_job restart
delayed_job: trying to stop process with pid 22284...
delayed_job: process with pid 22284 successfully stopped.
delayed_job: process with pid 22355 started.
app@StagingServer:/app/current$ touch tmp/restart.txt; RAILS_ENV=staging script/delayed_job restart
delayed_job: trying to stop process with pid 22355...
delayed_job: process with pid 22355 successfully stopped.
delayed_job: process with pid 22427 started.
app@StagingServer:/app/current$

Тем не менее, когда я выполняю развертывание с использованием капистрано

dev@ubuntu:~/app-site$ cap passenger:restart
    triggering start callbacks for `passenger:restart'
  * executing `multistage:ensure'
*** Defaulting to `staging'
  * executing `staging'
  * executing `passenger:restart'
  * executing "touch /app/current/tmp/restart.txt"
    servers: ["staging.app.com"]
    [staging.app.com] executing command
    command finished in 242ms
  * executing "cd /app/current;RAILS_ENV=staging script/delayed_job restart"
    servers: ["staging.app.com"]
    [staging.app.com] executing command
 ** [out :: staging.app.com] delayed_job: trying to stop process with pid 21646...
 ** [out :: staging.app.com] delayed_job: process with pid 21646 successfully stopped.
    command finished in 11889ms

Кажется нормально?Хотя последняя строка из delayed_job не печатается (я думаю, что из-за того, что она не заканчивается новой строкой), это успешно создает новый процесс.Однако не создает файл .pid , поэтому, когда я пытаюсь перезапустить его снова:

dev@ubuntu:~/app-site$ cap passenger:restart
    triggering start callbacks for `passenger:restart'
  * executing `multistage:ensure'
*** Defaulting to `staging'
  * executing `staging'
  * executing `passenger:restart'
  * executing "touch /app/current/tmp/restart.txt"
    servers: ["staging.app.com"]
    [staging.app.com] executing command
    command finished in 398ms
  * executing "cd /app/current;RAILS_ENV=staging script/delayed_job restart"
    servers: ["staging.app.com"]
    [staging.app.com] executing command
 ** [out :: staging.app.com] Warning: no instances running. Starting...
 ** [out :: staging.app.com] delayed_job: process with pid 21950 started.
    command finished in 6758ms

Он не останавливает существующий процесс.Как ни странно, на этот раз он создаст новый процесс , а - это файл .pid.

В результате у меня останется 2 запущенных процесса delayed_jobs и только один в файле .pid.Каждые 2 ограничения, которые я выполняю, добавят еще один процесс delayed_job.Предыдущие процессы использовали старую версию приложения, по сути ее нарушая.

config / deploy.rb:

namespace :passenger do
  desc "Restart Application"  
  task :restart do  
    run "touch #{current_path}/tmp/restart.txt"
    run "cd #{current_path};RAILS_ENV=#{deploy_env} script/delayed_job restart"
  end
end
after :deploy, "passenger:restart"
  • Ubuntu, nginx, passenger
  • daemons (1.1.4)
  • delayed_job (2.1.4)
  • rails (3.0.9)

И локально

  • capistrano (2.9.0)
  • capistrano-ext (1.2.1)

Обновление:

Чтение вокруг, кажется, этоможет быть связано с расой внутри демонов.Однако я немного запутался, почему он показывает только (и последовательно) при использовании capistrano.Я попытаюсь изменить команду на остановку, спать, затем начать.

Ответы [ 2 ]

7 голосов
/ 29 февраля 2012

Решено с помощью остановки и запуска вместо перезапуска.Работает из-за состояния гонки, возможно вызванного самоцветом демонов.

Я все еще хотел бы знать, есть ли у кого-нибудь еще лучшее решение.

0 голосов
/ 04 августа 2015

У меня была эта проблема, и остановка и запуск не работали для меня, поэтому я придумал следующее:

namespace :delayed_job do
desc 'Restart delayed_job worker'
  task :restart do
    on roles(:delayed_job) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :pkill , "-f", "'delayed_job'"
          execute :bundle, :exec, "bin/delayed_job", :start
        end
      end
    end
  end
end
...
after :restart,  "delayed_job:restart"

Не большой поклонник pkill, но это работает для меня последовательноНадеюсь, это поможет

...