Подтвердить что ты не робот

Запуск фонового процесса в задаче capistrano

Задача capistrano

namespace :service do
  desc "start daemontools (svscan/supervise/svscanboot)"
  task :start, :roles => :app do
    sudo "svscanboot&"
  end
end

Теперь это не работает: процесс svscanboot просто не запускается. Это помогло мне найти sleep: https://github.com/defunkt/resque/issues/284 другие источники указали мне на nohup, redirection и pty => true, поэтому я попробовал все это.

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 &"   # NO
run "(svscanboot&) && sleep 1"                       # NO
run "(nohup svscanboot&) && sleep 1"                 # YES!

Теперь, может ли кто-нибудь объяснить мне, почему мне нужен оператор сна и какая разница делает nohup? Для записи все вышеперечисленное работает одинаково хорошо, если выполняется из командной оболочки, проблема только в контексте capistrano.

спасибо

4b9b3361

Ответ 1

Мое простое решение - сделать файл svscanboot.sh на удаленном сервере любым кодом, который вы хотите запустить. В вашем случае

svscanboot >/tmp/svscanboot.log 2>&1

В задаче с крышкой добавить это

run "sh +x somefile.sh &"

это хорошо работает для меня.

Ответ 3

Я думаю, что nohup просто запускает процесс в фоновом режиме, поэтому вам не нужно явно устанавливать последний &.

Вы пробовали

run "nohup svscanboot >/tmp/svscanboot.log 2>&1"

(без окончания и отправки его на задний план).

Это должно работать и работать, когда ваша текущая сессия capistrano закрыта.

Ответ 4

Попробуйте это

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 & sleep 5", pty: false

Ответ 5

Я хотел бы поделиться своим решением, которое также работает при выполнении нескольких команд. Я попробовал много других вариантов, найденных в Интернете, включая взлома "сна 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)