【问题标题】:launching background process in capistrano task在 capistrano 任务中启动后台进程
【发布时间】:2012-06-04 23:08:57
【问题描述】:

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!

现在,谁能向我解释为什么我需要 sleep 语句以及 nohup 有什么不同? 作为记录,如果从用户 shell 运行,上述所有运行同样良好,问题仅在 capistrano 的上下文中。

谢谢

【问题讨论】:

  • nohup 确保您的命令在 shell 终止后收到 SIGHUP 信号时不会终止。不过,我也很好奇为什么 sleep 命令会有所作为。
  • 睡眠也改变了我的世界。令人费解的是,为什么 Capistrano 如此简单的任务却如此困难。
  • 我看到了同样的行为。并且想知道同样的事情。

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


【解决方案1】:

尝试按照此处的说明分叉该过程:Spawn a background process in Ruby

你应该可以做这样的事情:

job1 = fork do
  run "svscanboot"
end

Process.detach(job1)

另外,请查看:Starting background tasks with Capistrano

【讨论】:

    【解决方案2】:

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

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

    在 cap rake 任务中添加这个

    run "sh +x somefile.sh &"
    

    这对我很有效。

    【讨论】:

      【解决方案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】:

          我想分享我的解决方案,该解决方案在执行多个命令时也有效。我尝试了许多其他在网上找到的变体,包括“sleep N”hack。

          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)
          

          【讨论】:

            最近更新 更多