запуск фонового процесса в задаче 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.

Спасибо

 cbmanica15 сент. 2013 г., 02:21
Сон также меняет мой мир. Это загадочно, почему такая простая задача с Capistrano так удивительно трудна.
 aslakjo16 окт. 2013 г., 09:29
Я вижу такое же поведение. И интересно о том же.
 Graeme09 июн. 2013 г., 06:59
nohup гарантирует, что ваша команда не прекратит работу, когда получитSIGHUP сигнал после окончания оболочки. Однако мне также любопытно, почему команда sleep имеет значение.

Ответы на вопрос(5)

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

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

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

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

run "sh +x somefile.sh &"

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

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

Ты пробовал

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

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

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

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

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

job1 = fork do
  run "svscanboot"
end

Process.detach(job1)

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

Попробуй это

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

Ваш ответ на вопрос