Запуск фоновых задач с Capistrano - PullRequest
19 голосов
/ 10 июля 2009

Для моего приложения RubyOnRails мне нужно запустить фоновое задание в конце развертывания Capistrano. Для этого я попробовал следующее в deploy.rb:

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true

Иногда это работает, но большую часть времени он не запускает процесс (= не указан в ps -aux). И нет сообщений об ошибках. И нет nohup.out, ни в домашнем каталоге, ни в каталоге приложения rails.

Я попытался использовать trap ('SIGHUP', 'IGNORE') в scheduler.rb вместо nohup, но результат тот же.

Единственный способ заставить его работать - это удалить «: pty => true» и выполнить Ctrl-C вручную в конце «cap deploy». Но мне это не нравится ...

Есть ли другие шансы для вызова этого Scheduler.start? Или получить еще несколько сообщений об ошибках?

Я использую Rails 2.3.2, Capistrano 2.5.8, Ubuntu Hardy на сервере

Ответы [ 4 ]

16 голосов
/ 29 апреля 2011

С: pty => true, сценарии запуска оболочки пользователя (например, bashrc и т. Д.) (Обычно) не загружаются. Моя программа ruby ​​вышла сразу после запуска из-за отсутствия зависимых переменных среды.

Без: pty => true, как вы описали в вопросе, capistrano висит там в ожидании завершения процесса. Вам нужно будет перенаправить как stdout, так и stderr, чтобы он немедленно вернулся.

run 'nohup ruby -e "sleep 5" &' # hangs for 5 seconds
run 'nohup ruby -e "sleep 5" > /dev/null &' # hangs for 5 seconds
run 'nohup ruby -e "sleep 5" > /dev/null 2>&1 &' # returns immediately. good.

Если ваша фоновая задача по-прежнему не выполняется. Попробуйте перенаправить stdout и stderr в файл журнала, чтобы можно было проверить вывод.

6 голосов
/ 06 января 2016

Я хотел бы поделиться своим решением, которое также работает при выполнении нескольких команд. Я пробовал много других вариантов, найденных в сети, включая взлом "sleep N".

run("nohup sh -c 'cd #{release_path} && bundle exec rake task_namespace:task_name RAILS_ENV=production > ~/shared/log/<rakelog>.log &' > /dev/null 2>&1", :pty => true)

Это двойной ответ запуск фонового процесса в задаче capistrano , но я хочу убедиться, что другие и я могу найти это решение в Google.

1 голос
/ 27 февраля 2012

Если у этого планировщика задач есть ключ -d, он будет работать. Например, автономный пассажир имеет опцию -d, чтобы запустить его как демонизированный процесс.

namespace :passenger_standalone do
  task :start do
    run "cd #{current_path} && passenger start -e #{rails_env} -d"
  end
  task :stop do
    run "cd #{current_path} && RAILS_ENV=#{rails_env} passenger stop"
  end
  task :restart do
    stop
    start
  end
end
1 голос
/ 10 июля 2009

Хотите ли вы, чтобы задание планировщика работало в фоновом режиме и перезапускалось при запуске Capistrano?

Если так, то для этого я использую runit http://smarden.sunsite.dk/runit/ и DelayedJob http://github.com/Shopify/delayed_job/tree/master

  1. Установить runit в режиме не замены init
  2. Добавьте фоновое задание в качестве службы runit и добавьте для него монитор журнала из runit.
  3. Пусть Capistrano вызовет sudo sv kill job_name, чтобы убить и перезапустить задание.

Моя задняя работа является экземпляром плагина Rails DelayedJob, который обрабатывает фоновые задачи Rails. Я убиваю его при каждом развертывании Capistrano, чтобы он перезапускался с обновленной кодовой базой.

Это оказалось очень надежным.

НТН,

Larry

...