11

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!

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

谢谢

4

5 回答 5

1

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

你应该能够做这样的事情:

job1 = fork do
  run "svscanboot"
end

Process.detach(job1)

同样,请查看: 使用 Capistrano 启动后台任务

于 2012-12-20T22:54:37.327 回答
1

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

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

在 cap rake 任务中添加这个

run "sh +x somefile.sh &"

这对我很有效。

于 2016-01-09T18:26:28.247 回答
0

我认为nohup只需在后台启动该过程,因此您无需显式设置最后一个 &。

你试过了吗

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

(没有结尾 & 将其发送到后台)。

当您当前的 capistrano 会话关闭时,这应该可以工作并保持运行。

于 2014-09-16T08:06:28.000 回答
0

尝试这个

run "nohup svscanboot >/tmp/svscanboot.log 2>&1 & sleep 5", pty: false
于 2014-10-14T13:10:30.420 回答
0

我想分享我的解决方案,它在执行多个命令时也有效。我尝试了许多其他在网上找到的变体,包括“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)
于 2016-01-05T22:23:55.813 回答