Почему 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 также есть полезная ветка для запросов.