ruby退出尾部并从keypress继续下一部分脚本

时间:2012-03-22 00:39:56

标签: ruby loops ssh tail

我发现这段代码我无法找到退出尾部的好方法并转到脚本的下一部分。基本上我是第一部分,对运行脚本的人进行更改,使用下面的代码显示日志输出,然后转到用户按键上的脚本的下一部分。没有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接管I / O并且很难退出该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 :(得分:0)

您已将-f命令行选项提供给tail(1)。这明确指示tail(1)在用户键入^C或以其他方式终止程序时退出。如果您只想显示特定数量的文件并且,则可能希望使用-n命令行选项:

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

24将显示大约一个终端的数据,但如果您的终端更大或更小 - 或者您对不同数据量感兴趣 - 那么您可能希望进一步调整它。

tail(1)很强大;它是值得阅读它的文档,以防万一有更好的方法去做你想要完成的事情。

答案 1 :(得分:0)

我找到的解决方案是使用less而不是尾巴。试试这个:

less +F filename; echo 'after less'

当你点击ctrl + c时,q会减去它会退出然后回显你想要的东西。