为什么IO.popen挂在有效命令上?

时间:2011-11-28 21:59:00

标签: ruby curl stream popen

我正在使用IO.popen来运行curl命令(八位字节流POST)。我复制命令并在命令行上运行它,它的工作原理。但是,使用popen在Ruby中运行它会导致流在我的服务器上意外终止,而Ruby脚本只会挂起,curl无休止地运行。

这就是我正在做的事情:

curl = "curl "
curl += "--cookie \"JSESSIONID=#{@sessionid}\" "
curl += "-H \"Content-type:application/octet-stream\" "
curl += "-X POST "
curl += "-o \"#{responseFile}\" "
curl += "--data-binary \"@#{filename}\" "
curl += "\"#{url}\""

puts "command: #{curl}"

IO.popen(curl, "r") { |out|
  out.readlines
}
# Script never makes it to here
我必须做些傻事。它是什么?

Here is the stdout from curl.

我正在使用Ruby 1.8.6

2 个答案:

答案 0 :(得分:0)

popen还为curl提供了从读取的管道,如下例所示:

$ echo -e 'foo\nbar\nzoo' | \
  ruby -e 'pipe = IO.popen("grep oo", "r") {|out| p out.readlines}'
["foo\n", "zoo\n"]

我想curl想要从stdin发送到服务器,没有任何东西来自,所以它会超时30秒。

答案 1 :(得分:0)

为什么不利用Ruby的许多宝石做同样的事情,而不是编写自己的版本的轮子?

我建议您使用typhoeuscurb作为起点。此外,内置OpenURI可以很好地满足大多数“获取”类型的需求。

对于此帖子请求,SO上还有一个useful thread