Запуск фонового процесса в задаче 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.
спасибо
Ответы
Ответ 1
Мое простое решение - сделать файл svscanboot.sh на удаленном сервере любым кодом, который вы хотите запустить. В вашем случае
svscanboot >/tmp/svscanboot.log 2>&1
В задаче с крышкой добавить это
run "sh +x somefile.sh &"
это хорошо работает для меня.
Ответ 2
Попробуйте использовать процесс, описанный здесь: Создайте фоновый процесс в Ruby
Вы должны сделать что-то вроде этого:
job1 = fork do
run "svscanboot"
end
Process.detach(job1)
Кроме того, проверьте это: Запуск фоновых задач с помощью Capistrano
Ответ 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)