在我的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?
答案 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
的例外标准类。