2012-03-22 14 views
1

我发现这段代码时遇到了麻烦,试图找到一种退出尾部并转到脚本的下一部分的好方法。本质上我是第一部分为运行脚本的人员进行更改,使用下面的代码显示日志输出,然后在用户键盘上移动到脚本的下一部分。没有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 

UPDATE 的-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!" 
+0

请注意,您没有将任何参数传递给'do_tail'函数,该函数只允许它在文件的一部分上运行'tail';问题是“你需要查看更多日志吗?”本着“在日志中进一步查看”或本着“为了防止日志文件发生变化而查看日志文件的最后22行”的精神,本意是什么? – sarnold 2012-03-23 23:02:49

+0

也许要做的事情是稍微后退一步,描述你想要完成的事情;这个脚本是什么帮助你做的? – sarnold 2012-03-23 23:03:25

回答

0

你给的-f命令行选项来tail(1)。明确指示tail(1)在用户输入^C或以其他方式杀死程序时退出。如果你只是想显示文件的具体数额和跟随,那么你可能想使用,而不是-n命令行选项:

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

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

tail(1)功能强大;如果有更好的方法来完成你想要完成的任务,那么阅读它的文档是值得的。

+0

我意识到-f是使这个变得复杂的罪魁祸首。不幸的是它是必要的。通过开始一个循环并分批输出最新的行,我几乎增加了一大堆复杂性。我认为我的解决方案将涉及抓住尾巴的pid,并通过该通道发送杀死该pid以退出尾巴。这样它就可以运行,直到用户通过按下“q”来进行干预,然后我会找出STDIN上的一个循环来寻找“q”,然后触发杀死,然后继续执行脚本的其余部分。除非有人有更优雅的解决方案? – kalikid021 2012-03-22 17:11:26

0

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

less +F filename; echo 'after less' 

当你点击ctrl + c时,q就会少一些就退出然后回显你想要的。