Вопрос по shell, ruby-on-rails, linux – запуск фонового процесса в задаче capistrano

11

задача капистрано

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.

Спасибо

Я вижу такое же поведение. И интересно о том же. aslakjo
nohup гарантирует, что ваша команда не прекратит работу, когда получитSIGHUP сигнал после окончания оболочки. Однако мне также любопытно, почему команда sleep имеет значение. Graeme
Сон также меняет мой мир. Это загадочно, почему такая простая задача с Capistrano так удивительно трудна. cbmanica

Ваш Ответ

5   ответов
0

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

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)
0

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

Ты пробовал

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

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

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

0

Попробуйте разветвить процесс, как описано здесь:Создайте фоновый процесс в Ruby

Вы должны быть в состоянии сделать что-то вроде этого:

job1 = fork do
  run "svscanboot"
end

Process.detach(job1)

А также зацените это:Запуск фоновых задач с Capistrano

1

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

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

В кепке грабли добавьте задачу

run "sh +x somefile.sh &"

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

0

Попробуй это

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

Похожие вопросы