Почему IO.popen висит на действительной команде? - PullRequest
2 голосов
/ 29 ноября 2011

Я использую IO.popen для запуска команды curl (POST потока октетов).Я копирую команду и запускаю ее в командной строке, и она работает.Однако запуск его в Ruby с popen приводит к неожиданному завершению потока на моем сервере, и скрипт 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

Я должен делать что-то глупое.Что это?

Вот стандартный вывод от curl.

Я использую Ruby 1.8.6

Ответы [ 2 ]

0 голосов
/ 16 декабря 2011

Вместо того, чтобы написать свою собственную версию колеса, почему бы не воспользоваться многими драгоценностями для Ruby, которые делают то же самое?

Я бы рекомендовал и typhoeus , curb для начальных точек. Также встроенный OpenURI прекрасно работает для большинства нужд типа "get".

На SO также есть полезная ветка для этого сообщения.

0 голосов
/ 16 декабря 2011

popen также дает curl трубу для чтения из , как показано в этом примере:

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

Я полагаю, что curl хочет отправить POST на сервер также из стандартного ввода, откуда ничего не происходит, поэтому время ожидания составляет 30 с.

...