ruby выйти из хвоста и перейти к следующей части скрипта от нажатия клавиши - PullRequest
1 голос
/ 22 марта 2012

Я нашел этот фрагмент кода. У меня возникли проблемы при попытке найти хороший способ выйти из хвоста и перейти к следующей части сценария.По сути, я делаю первую часть, чтобы внести изменения для человека, выполняющего сценарии, показать вывод журнала с использованием приведенного ниже кода, а затем перейти к следующей части сценария при нажатии клавиши пользователем.Я не могу выйти из хвоста без CTRL-C.

def do_tail( session, file )
  session.open_channel do |channel|
    channel.on_data do |ch, data|
      puts "[#{file}] -> #{data}"
    end
    channel.exec "tail -f #{file}"
  end
end

Net::SSH.start("server", "user", :keys => ["/user/.ssh/id_dsa"]) do |session|
  do_tail session, "/var/log/apache2/error.log"
  do_tail session, "/var/log/apache2/access.log"
  session.loop
end

ОБНОВЛЕНИЕ -f захватывает ввод-вывод и затрудняет выход из этого канала ssh.Я решил перейти к предложениям и изменить его.Вот результат, если кто-то еще захочет помочь по этой теме.

require 'rubygems'
require 'net/ssh'

def exit?
        begin
                while input = STDIN.read_nonblock(1)
                return true if input == 'q'
                end
                false
                rescue Errno::EINTR
                false
                rescue Errno::EAGAIN
                false
                rescue EOFError
                true
        end
end

def do_tail( session, file )
        session.open_channel do |channel|
                channel.on_data do |ch, data|
                        puts "[#{file}]\n\n#{data}"
                end
                channel.exec "tail -n22 #{file}"
        end
end

def loggy
        iteration = 0
        loop do
                iteration = (iteration + 1)
                Net::SSH.start("server", "user", :keys => ["/user/.ssh/id_dsa"]) do |session|
                        do_tail session, "/var/log/apache2/error.log"
                end
                puts "\n\nType 'q' and <ENTER> to exit log stream when you are done!\n\n"
                sleep 5
        break if exit? or iteration == 3
        end
end

loggy

loop do
        puts "\nDo you need to view more of the log? (y/n)\n"
        confirm = gets.chomp
        if confirm =="y"
                loggy
        else
        end
        break if confirm == "n"
end
puts "Part Deaux!"

Ответы [ 2 ]

0 голосов
/ 28 сентября 2012

Я нашел решение использовать less вместо tail.Попробуйте это:

less +F filename; echo 'after less'

Когда вы нажмете Ctrl + C, q меньше, он выйдет, а затем повторить то, что вы хотите.

0 голосов
/ 22 марта 2012

Вы задали параметр командной строки -f для tail(1).Это явно указывает tail(1) на выход, когда пользователь вводит ^C или иным образом убивает программу.Если вы просто хотите, чтобы конкретный объем файла отображался, а , а не , следовало бы использовать вместо этого параметр командной строки -n:

channel.exec "tail -n 24 #{file}"

24будет отображать данные примерно одного терминала, хотя, если ваши терминалы больше или меньше - или вас интересуют разные объемы данных, - возможно, вы захотите настроить их еще больше.мощный;стоило бы прочитать его документацию на тот случай, если есть еще лучший способ сделать то, что вы пытаетесь достичь.

...