需求: windows 系统,在程序中运行命令"ping X.X.X.X -t"10 秒,并在 10 秒后停止 ping,并返回这段时间内 ping 命令的回显。
刚开始觉得挺简单的,设置超时时间,然后调用 ping 命令,到点抛异常并捕获,输出回显。
require 'timeout'
result = ""
begin
timeout(10) do
result = `ping 127.0.0.1 -t` #假设ip为127.0.0.1
end
rescue Exception
puts result
puts $!
end
运行后发现完全不是想象的样子...
execution expired
然后开始上网搜寻解决方法,发现没有一个方法能满足需求,最后在一个英文论坛中找到半个解决方案,只能在 10 秒后结束 ping -t 命令,但获取不了内容,而且代码还很长,涉及到 IO.poen,Process.waitpid2 之类的命令,没看太明白,还有些解决方案中提到用 fork,open3,open4 的方法,比较简洁,但是在 windows 下这些都无法使用,无奈之下,只好来论坛求助. 我觉得这个需求很简单,很常见,因为不一定是 ping -t 命令,凡是涉及到很多耗时的操作,需要中断并取得操作结果的场景,都和这个类似,像这种需求,实现起来应该会有简洁优雅的方式吧,只是我没找到?希望大家能给点帮助,多谢!