capistrano任务
namespace :service do
desc "start daemontools (svscan/supervise/svscanboot)"
task :start, :roles => :app do
sudo "svscanboot&"
end
end
现在这不起作用:svscanboot进程根本不运行。
这有助于我找到sleep
: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会有什么不同? 对于记录,如果从用户shell运行,上述所有内容同样运行良好,问题仅出现在capistrano的上下文中。
感谢
答案 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)