在capistrano任务中启动后台进程

时间:2012-06-04 23:08:57

标签: ruby-on-rails linux shell capistrano background-process

capistrano任务

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

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

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

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

感谢

5 个答案:

答案 0 :(得分:1)

我的简单解决方案是在远程服务器上使用您想要运行的任何代码生成svscanboot.sh文件。在你的情况下

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

在上限任务中添加此

run "sh +x somefile.sh &"

这适合我。

答案 1 :(得分:0)

尝试按照此处的说明分配流程:Spawn a background process in Ruby

你应该可以这样做:

job1 = fork do
  run "svscanboot"
end

Process.detach(job1)

同样,请查看以下内容:Starting background tasks with Capistrano

答案 2 :(得分:0)

我认为nohup只是在后台启动流程,因此您无需明确设置最后一个&。

你试过吗

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

(没有结尾&将其发送到后台)。

当您当前的capistrano会话关闭时,这应该可以正常运行。

答案 3 :(得分:0)

试试这个

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

答案 4 :(得分:0)

我想分享我的解决方案,该解决方案在执行多个命令时也有效。我在网上尝试了很多其他变种,包括“睡眠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)