У меня есть кластер из трех дворняг, работающих под nginx, и я развертываю приложение с помощью Capistrano 2.4.3. Когда я "ограничиваю развертывание" при работающей системе, происходит следующее:
В выводе cap deploy есть следующее:
Похоже, что mongrel_rails cluster :: restart не ожидает полной остановки должным образом перед попыткой перезапуска кластера. Как мне диагностировать и исправить эту проблему?
Обновлено: Вот ответ:
mongrel_cluster в задаче «перезапуск» просто делает следующее:
def run
stop
start
end
Он не ожидает или не проверяет, завершился ли процесс до вызова команды «start». Это отправлена известная ошибка с выдающимся патчем. Я применил патч к Mongrel Cluster, и проблема исчезла.





Я ненавижу быть таким простым, но похоже, что файлы pid все еще торчат, когда он пытается запуститься. Убедитесь, что дворняга остановлена вручную. Очистите файлы pid вручную. Потом делайте шапку развёртывать.
Во-первых, сузьте область тестирования, позвонив только cap deploy:restart. Возможно, вы захотите передать параметр --debug для запроса перед удаленным выполнением или параметр --dry-run, чтобы увидеть, что происходит, когда вы настраиваете свои параметры.
На первый взгляд это звучит как проблема с разрешениями для файлов pid или mongrel-процессов, но это сложно сказать наверняка. Несколько вещей, которые бросаются в глаза:
:runner явно установлена на nil - Для этого была конкретная причина?:admin_runner. Возможно, это связано с вашей проблемой, если вы не видите весь рецепт?
:runner vs. :admin_runner (from capistrano 2.4 release) Some cappers have noted that having deploy:setup and deploy:cleanup run as the :runner user messed up their carefully crafted permissions. I agreed that this was a problem. With this release, deploy:start, deploy:stop, and deploy:restart all continue to use the :runner user when sudoing, but deploy:setup and deploy:cleanup will use the :admin_runner user. The :admin_runner variable is unset, by default, meaning those tasks will sudo as root, but if you want them to run as :runner, just do “set :admin_runner, runner”.
Моя рекомендация, что делать дальше. Вручную остановите дворняжек и очистите PID. Запустить дворняг вручную. Затем продолжайте запускать cap deploy:restart во время отладки проблемы. При необходимости повторите.
Вы можете явно указать рецептам mongrel_cluster удалить файлы pid перед запуском, добавив следующее в свои рецепты капистрано:
# helps keep mongrel pid files clean
set :mongrel_clean, true
Это заставляет его передать параметр --clean в mongrel_cluster_ctl.
Я вернулся и посмотрел на один из моих рецептов развертывания и заметил, что я также изменил способ работы моей задачи перезапуска. Взгляните на следующее сообщение в группе пользователей mongrel:
беспорядочные пользователи обсуждение перезагрузки
Вот мое развертывание: задача перезапуска. Я признаю, что это что-то вроде взлома.
namespace :deploy do
desc "Restart the Mongrel processes on the app server."
task :restart, :roles => :app do
mongrel.cluster.stop
sleep 2.5
mongrel.cluster.start
end
end
Это на правильном пути. См. Мое изменение вопроса: есть патч для mongrel_cluster, который исправляет поведение.
В любом случае, мои дворняги запускаются до того, как предыдущая команда останова завершила их отключение.
sleep 2.5 - не лучшее решение, если для остановки всех запущенных дворняг требуется больше 2,5 секунд.
Похоже, есть потребность в:
stop && start
против.
stop; start
(так работает bash, && ожидает завершения первой команды без ошибки, а ";" просто выполняет следующую команду).
Интересно, есть ли:
wait cluster_stop
then cluster_start
Взгляните на это: rubyforge.org/tracker/…
Хорошее обсуждение: http://www.ruby-forum.com/topic/139734#745030
Спасибо, Райан. Я думаю, ты меня отвязал. Когда я ее решу, я свяжусь с ней.