2013-01-18 31 views
6

Tôi có mã này vào đuôi file log từ xa:đuôi với grep file log từ xa

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 

    Net::SSH.start("host", "user", :password => "passwd") do |session| 
     do_tail session, "/path_to_log/file.log" 
     session.loop 

Tôi muốn lấy chỉ các dòng với "ERROR" chuỗi trong file.log, tôi đang cố gắng để gọi là "đuôi -f # {file} | grep ERROR "nhưng không thành công.

Xin cảm ơn trước.

+2

Đầu ra của 'tail -f # {file} | grep ERROR'? – Hugo

+3

Bạn có thể thử thêm '--line-buffered' vào lệnh grep của mình. – Cyrus

+0

Có lẽ bạn nên thử một cái gì đó như "bash -c 'tail -f # {file} | grep ERROR'" – user3132194

Trả lời

0

Tôi không chắc chắn bạn muốn chạy tail -f #{file} | grep ERROR bên trong một .loop. Cờ -f cho biết tail để tiếp tục phát trực tuyến dữ liệu và bạn không bao giờ thoát luồng đó bằng Ctrl + C.

Bạn có thể chỉ muốn sử dụng lệnh Bash đơn giản cho điều này, bạn thậm chí không cần phương thức .exec. Hãy thử một cái gì đó như sau:

def do_tail session, file 
    @keyword = 'ERROR' 
    session.open_channel do |channel| 
    channel.on_data {|ch, data| puts "[#{file}] -> #{data}"} 
    `grep #{keyword} #{file}` 
    end 
end 
Các vấn đề liên quan