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其他来源指出我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有什么区别? 为了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)