在capistrano任务中启动后台进程

Vik*_*rón 11 linux shell capistrano ruby-on-rails background-process

capistrano任务

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

现在这不起作用:svscanboot进程根本不运行.这帮助我找到sleep:https://github.com/defunkt/resque/issues/284 其他来源向我指出nohup,redirectionpty => true,所以我尝试了所有这些.

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 &"   # NO
run "(svscanboot&) && sleep 1"                       # NO
run "(nohup svscanboot&) && sleep 1"                 # YES!
Run Code Online (Sandbox Code Playgroud)

现在,任何人都可以向我解释为什么我需要睡眠声明和nohup有什么区别?对于记录,如果从用户shell运行,上述所有内容同样运行良好,问题仅出现在capistrano的上下文中.

谢谢

Jon*_*ald 1

尝试分叉该进程,如下所述: 在 Ruby 中生成后台进程

你应该能够做这样的事情:

job1 = fork do
  run "svscanboot"
end

Process.detach(job1)
Run Code Online (Sandbox Code Playgroud)

另外,请查看此: 使用 Capistrano 启动后台任务