2012-03-22 4 views
1

このコードスニペットが見つかりました。私は、テールを終了してスクリプトの次の部分に進む良い方法を見つけようとしています。基本的には、スクリプトを実行している人に変更を加え、以下のコードを使ってログの出力を表示し、ユーザーのキー入力時にスクリプトの次の部分に移動する最初の部分です。私はCTRL-Cを使わずに尾から出ることはできません。ruby​​ exit tailとkeypressからスクリプトの次の部分に進みます

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

ファイルの一部だけに 'tail'を実行させる' do_tail'関数にはパラメータを渡していないことに注意してください。 「ログの詳細を表示する必要がありますか?」という質問です「ログに戻って見る」または「変更した場合に備えてログファイルの最後の22行を表示する」という精神の中で意図されていますか? – sarnold

+0

おそらくやるべきことはもう少し後退して、達成しようとしていることを説明することです。このスクリプトは何を手助けしていますか? – sarnold

答えて

0

あなたはtail(1)から-fコマンドラインオプションを与えてくれました。これは、ユーザーが^Cを入力するか、そうでなければプログラムを強制終了すると、明示的にtail(1)を終了するよう指示します。あなただけ示すとないが従うべきファイルの特定の量が必要な場合は、代わりに-nコマンドラインオプションを使用したい場合があります

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

24は、しかし、データのおよそ1端末の価値が表示されますあなたの端末がより大きくても小さくても、あるいはあなたが異なる量のデータに興味を持っているなら、それをさらに微調整したいかもしれません。

tail(1)は強力です。あなたが達成しようとしていることをやるためのより良い方法がある場合に備えて、そのドキュメントを読む価値があります。

+0

私は、-fがこれを複雑にする真の犯人であることを認識しています。残念ながらそれは必要です。私は、ループを開始し、最も新しい行をバッチで出力することによって、巨大な複雑さをほとんど追加しました。私の解決策は、尾のpidをつかんで、その尾を出るためにそのpidにチャンネルを介して殺すことです。そうすれば、ユーザが "q"を押すまで介入することができ、STDIN上で "q"を探してループを突き止め、killをトリガーし、スクリプトの残りの部分に進むことができます。誰かがより洗練されたソリューションを持っていないかぎり? – kalikid021

0

解決策は、尾の代わりにlessを使用することでした。これを試してください:

ctrl + cを押すと、qを小さくすると終了してから、必要なものをエコーし​​ます。