如果我用以下方式打开:
输入,输出,错误= Open3.popen3“nikto -host someip -port 80 -output xml”
如何检测nikto是否已完成?扫描完成需要一段时间。
如果出现问题,我想我必须定期检查错误,看看是否写了什么?
open3是否存在任何体面的文档?不,红宝石文档远远不够。
答案 0 :(得分:3)
input, output, error = Open3.popen3 "nikto -host someip -port 80 -output xml"
if select([output], nil, nil, 0.1) and output.eof?
# process exited and doesn't have output queued.
else
# still running or has output not read yet.
end
此外,这里有一些我通过Google搜索找到的好文档:http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/open3/rdoc/index.html
答案 1 :(得分:1)
您可以从$?
Process.wait $?.pid击>
<击> 撞击>
原来那是错的。 在这里查看一些选项:
http://en.wikibooks.org/wiki/Ruby_Programming/Running_Multiple_Processes
答案 2 :(得分:1)
如果您正在使用任何* nix操作系统,那么当子进程退出时,您的进程将收到SIGCHLD。根据您是否一次有多个子进程,可以使用它来检测它何时结束。
此外,子流程的IO通道是通过管道实现的,所以你肯定会在输出结束时获得一个EOF,并且在关闭时也可能获得SIGPIPE。
在Ruby中,安装信号处理程序只是:
Signal.trap("CHLD") do
Process.wait
$child_died = true
end
答案 3 :(得分:0)
执行命令后看到输出
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
puts "stdout is:" + stdout.read
puts "stderr is:" + stderr.read
end
逐步看到输出
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
while line = stderr.gets
puts line
end
end
检查更多选项 http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html