启动capistrano任务的后台进程

capistrano任务

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

现在,这不起作用:svscanboot过程根本不运行。 这帮助我findsleep : https : //github.com/defunkt/resque/issues/284其他来源指出我nohupredirection ,并且pty => true ,所以我尝试了所有这些。

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

现在,有谁能向我解释为什么我需要睡眠声明,nohup有什么区别? 为了logging所有上述运行同样好,如果从用户shell运行,问题只在capistrano的上下文中。

谢谢

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

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

    在耙耙任务添加此

     run "sh +x somefile.sh &" 

    这对我很好。

    尝试按照这里解释的方法分叉进程: 在Ruby中产生一个后台进程

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

     job1 = fork do run "svscanboot" end Process.detach(job1) 

    同样,结帐: Capistrano开始后台任务

    我认为nohup只是启动后台进程,所以你不需要明确设置最后的&。

    你试过了吗

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

    (没有结束并发送到后台)。

    当你目前的capistrano会议结束时,这应该工作,并保持运行。

    尝试这个

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

    我想分享我的解决方案,这也适用于执行多个命令。 我尝试了许多其他在线发现,包括“睡眠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)