2014-12-13 5 views
1

У меня есть рубиновый скрипт на удаленном сервере, который я запускаю через Net: SSH на моем локальном компьютере.Make Net: обновление SSH возвратило пакеты данных/куски в блоке exec чаще

Удаленный сценарий занимает несколько минут для запуска и выводит его прогресс в стандартный вывод.

Проблема в том, что блок в моей команде exec только вызывается, когда пакет/блок заполнен.
Таким образом, я получаю прогресс всего за один удар каждую минуту.

Вот некоторые вырубленные примеры, которые иллюстрируют мою проблему:

Сервер сценариев:

(0.999).each do |i| 
    puts i 
    sleep 1 
end 
puts 1000 

Local Script:

Net::SSH.start('ip.v.4.addr', 'user', :keys => ['my_key']) do |ssh| 

    ssh.exec("ruby count_to_1000.rb") do |ch, stream, data| 
    puts data if stream == :stdout 
    end 

    ssh.loop(1) 

end 

Есть ли способ, с пульта дистанционного управления сценарий для принудительной отправки пакета/куска?
Или есть способ установить предел, скажем, второй (или n бит), прежде чем он покраснеть? (в пределах сети: SSH)

Спасибо за вашу помощь!

ответ

1

Попробуйте flush:

http://www.ruby-doc.org/core-2.1.5/IO.html#method-i-flush

(0.999).each do |i| 
    puts i 
    STDOUT.flush 
    sleep 1 
end 

Или sync:.

http://www.ruby-doc.org/core-2.1.5/IO.html#method-i-sync

STDOUT.sync = true 
(0.999).each do |i| 
    puts i 
    sleep 1 
end 

(непроверенная, кстати Может быть, они должны быть использованы на стороне клиента вместо этого, или на некоторых другой поток ввода-вывода. Но это те два метода, которые сразу приходят на ум.)

+0

'STDOUT.flush' заставлял все работать, как будто я очень хотел благодарности!По мере того, как вы отправляли сначала, включали рабочий пример и ссылку на документы, зеленый галочка - ваш. Еще раз спасибо! – complistic

1

В моей тестовой настройке это работает так, как ожидалось (проверено на localhost). Однако могут возникнуть некоторые проблемы с STDOUT-флешем.

Вы пытаетесь написать, чтобы написать STDOUT вместо puts (Я слышал, что есть какая-то разница, которую я действительно не понимаю).

Таким образом, вы можете на Вашем сервере:

(0.999).each do |i| 
    STDOUT.puts i 
    sleep 1 
end 
STDOUT.puts 1000 
#You could possibly also use "STDOUT.write 1000", but it will not append a newline, like puts does. 

Если это не работает, то вы можете попытаться принудительно Промойте STDOUT с помощью STDOUT.flush(). Я считаю, что то же самое можно достичь, написав пустую строку в STDOUT, но я не уверен на 1000%.

Также может случиться так, что команда exec фактически ждет завершения процесса по какой-либо причине (я не смог понять из документов). В этом случае вы не сможете достичь того, чего хотите. Затем вы можете рассмотреть возможность создания веб-сайтов, используйте DRB или некоторые другие способы передачи данных.

+0

'puts' включен из' Kernel', поэтому называет 'Kernel # puts'. Что в основном вызывает '$ stdout.puts', если не существует' ARGV'. И '$ stdout' содержит' STDOUT', если он где-то не переопределен. –