Почему IO.popen висит на действительной команде?

Я использую 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

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

Вот выход из локона.

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

2 ответа

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 секунд.

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

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

На SO также есть полезная ветка для запросов.

Другие вопросы по тегам