我发现这段代码时遇到了麻烦,试图找到一种退出尾部并转到脚本的下一部分的好方法。本质上我是第一部分为运行脚本的人员进行更改,使用下面的代码显示日志输出,然后在用户键盘上移动到脚本的下一部分。没有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!"
请注意,您没有将任何参数传递给'do_tail'函数,该函数只允许它在文件的一部分上运行'tail';问题是“你需要查看更多日志吗?”本着“在日志中进一步查看”或本着“为了防止日志文件发生变化而查看日志文件的最后22行”的精神,本意是什么? – sarnold 2012-03-23 23:02:49
也许要做的事情是稍微后退一步,描述你想要完成的事情;这个脚本是什么帮助你做的? – sarnold 2012-03-23 23:03:25