在给定条件不良的情况下使用异常在执行过程中停止IO.popen

时间:2012-03-16 21:39:37

标签: ruby

在我的Ruby脚本中,我调用Perl脚本并等待它完成执行。但是,有时候Perl脚本会遇到一系列错误,我希望Ruby能够自动处理这些错误。所以,我实现了以下......

begin
    IO.popen(cmdLineExecution) do |stream|
          stream.each do |line|
              puts line
              if line =~ /Some line that I know is an error/
                 raise MyOwnException
              end 
          end
    end

    begin
          #Wait on the child process
          Process.waitpid 
    rescue Errno::ECHILD
    end
rescue MyOwnException
   #Abort the command mid processing, and handle the error
end

但是,即使抛出异常,Perl脚本仍会继续执行,只是它不再将输出传递给STDOUT。此时,如果我想停止Perl进程,我必须进入任务管理器并手动停止它。然后Process.waitpid结束并从那里继续。或者我停止Ruby并且Perl进程继续在后台运行,我仍然需要手动停止它。

BTW:这是在Windows上

因此,问题是如何在没有Perl进程成为孤立进程中间进程的情况下停止IO.popen?

1 个答案:

答案 0 :(得分:6)

所以 - 免责声明,我使用的是Ruby 1.8.6和Windows。它是我目前使用的软件唯一支持的Ruby,因此可能有更优雅的解决方案。总的来说,在继续执行之前,使用Process.kill命令确保进程死亡。

IO.popen(cmdLineExecution) do |stream|
  stream.each do |line|                         
      puts line
      begin
        #if it finds an error, throws an exception
        analyzeLine(line) 
      rescue correctionException 
        #if it was able to handle the error 
        puts "Handled the exception successfully"
        Process.kill("KILL", stream.pid) #stop the system process
      rescue correctionFailedException => failedEx
        #not able to handle the error
        puts "Failed handling the exception"
        Process.kill("KILL", stream.pid) #stop the system process
        raise "Was unable to make a known correction to the running enviorment: #{failedEx.message}"
      end
  end
end

我制作了继承Exception的例外标准类。