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其他来源指出我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的上下文中。
谢谢
以编程方式检查进程是否在后台运行
后台进程closuresssh客户端后终止
如何使通过Web服务器接受命令的Linux服务?
如何控制后台进程/守护进程
每隔2分钟刷新一次GNU的bash循环
如何在c ++中执行主程序时在后台检查是否已经过了一分钟?
我如何与后台Python实例进行通信?
如何在shell中启动一个工作,即使启动它的shell终止,这个工作也将持续下去
我简单的解决方案将使远程服务器上的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)