Ruby中使用Open3.popen3执行nslookup时程序挂起的问题求助
Ruby中使用Open3.popen3执行nslookup时程序挂起的问题求助
嘿,我来帮你捋捋这个问题~
你遇到的程序挂起情况,根源在于nslookup是一个交互式工具:当你通过popen3启动它之后,它会一直运行并等待你输入下一个查询指令,而不是返回结果后自动退出。你的代码里只调用了sout.gets,它只会读取输出的第一行,之后程序就卡在那里——一边nslookup在等你继续输入,另一边你的Ruby代码在等nslookup输出更多内容,形成了死锁。
你在交互式模式下按Ctrl+C后再执行能成功,是因为Ctrl+C终止了nslookup进程,此时输出流被关闭,gets才能读到剩余的内容。
下面给你几个解决方案:
方案一:让nslookup非交互式运行(最推荐)
直接把要查询的域名作为参数传给nslookup,这样它查询完成后会自动退出,不会进入交互模式:require 'open3' sin, sout, serr = Open3.popen3('nslookup www.google.co.nz') puts sout.read方案二:关闭输入流告知nslookup结束输入
如果你一定要用交互式方式,在发送完查询指令后关闭输入流,让nslookup知道没有更多命令了,它就会退出,之后你就能读取所有输出:require 'open3' sin, sout, serr = Open3.popen3('nslookup') sin.puts "www.google.co.nz" sin.close # 关闭输入流,触发nslookup退出 puts sout.read # 读取全部输出内容方案三:使用块式调用管理进程资源
用Open3.popen3的块调用方式,它会自动处理进程的等待和资源清理,更安全可靠:require 'open3' Open3.popen3('nslookup') do |sin, sout, serr, wait_thr| sin.puts "www.google.co.nz" sin.close puts sout.read exit_status = wait_thr.value # 等待进程结束并获取退出状态 end
备注:内容来源于stack exchange,提问作者Teererai Marange
相关产品推荐
相关产品推荐

