Ruby 在rake任务中,执行命令,读取stdout直到某一行匹配,然后分离并继续任务

Ruby 在rake任务中,执行命令,读取stdout直到某一行匹配,然后分离并继续任务,ruby,process,io,rake,stdout,Ruby,Process,Io,Rake,Stdout,我想启动一个JavaServlet,观察它的标准输出,直到我看到它已完全加载,然后返回到我的rake任务的其余部分,同时保持该进程运行。目前我有这样的想法: IO.popen "java -jar ./tools/tests/servlet.jar" do |io| io.each do |line| puts line Process.detach(io.pid) if line.include? 'Server ready.' # need help here end

我想启动一个JavaServlet,观察它的标准输出,直到我看到它已完全加载,然后返回到我的rake任务的其余部分,同时保持该进程运行。目前我有这样的想法:

IO.popen "java -jar ./tools/tests/servlet.jar" do |io|
  io.each do |line|
    puts line
    Process.detach(io.pid) if line.include? 'Server ready.' # need help here
  end
end

puts "Ready..."
如何退出此IO块以继续执行任务,同时保持进程运行?谢谢大家!

编辑:临时错误解决方案


如果我理解正确,请尝试以下方法:

if(line.include? 'Server ready.')
  Process.detach(io.pid)
  exit(0)
end

谢谢@Linuxios,但这仍然让我处于这个过程中。当我按ctrl+c键终止服务器时,我的任务会继续执行,但我需要在没有按ctrl+c键的情况下执行。我可以附加&让服务器在后台运行并读取io,直到我得到我想要的东西,但肯定有更好的方法吗?唉,仍然停留在这个过程中,除了SIGINT现在不再由任务的其余部分跟进。至少break会在SIGINT之后继续执行任务。我想现在我只需要将它发送到后台,然后从该条件内部调用我的任务的其余部分。但这并不是一个很好的解决方案。如果其他人有更好的解决方案,请务必让我知道@格洛托:等等。再给我解释一下这个问题。它把您留在了哪个进程中?servlet进程在IO块之后保留了其他任何内容。现在,我决定在后台运行servlet后,在IO块内生成一个传入块,这很好,但最终我宁愿从该过程中分离出来,通过pid跟踪它,稍后再返回。
if(line.include? 'Server ready.')
  Process.detach(io.pid)
  exit(0)
end