2011-12-27 20 views
15

Tôi có một thư mục đầy đủ các tệp nhật ký cuộn mà tôi muốn có thể sử dụng đuôi.Tailing Rolling Files

Các tập tin được đặt tên như vậy:

name  modified 
00A.txt Dec 27 19:00 
00B.txt Dec 27 19:01 
00C.txt Dec 27 19:02 
00D.txt Dec 27 19:03 

Trên một hệ thống unix cũ, tôi đang cố gắng để đưa ra một kịch bản shell rằng sẽ đuôi file gần đây nhất là sửa đổi trong một thư mục cụ thể, và nếu tập tin đó được đóng về mặt hành chính (cuộn tới tệp tiếp theo) Tôi muốn chương trình tự động bắt đầu tailing tệp mới mà không cần phải thoát khỏi đuôi để chạy lại.

tail -100f `ls -t | head -1` 

Các hành vi mong muốn, do tên tập tin ở trên, sẽ đi như thế này:

./logtailer.sh 

Sau đó kịch bản sẽ bắt đầu tailing 00D.txt. Ngay sau khi trình ghi nhật ký được hoàn tất bằng văn bản thành 00D.txt và tệp nhật ký mới nhất hiện được đặt tên là 00E.txt, chương trình sẽ tự động bắt đầu tailing tệp đó.

Người ta có thể viết kịch bản này bằng cách xem đầu ra của đuôi cho văn bản "File Administratively Closed" và sau đó có lệnh sau chạy lại.

tail -100f `ls -t | head -1` 

Có cách nào thanh lịch hơn để thực hiện việc này không bằng cách xem văn bản "tệp được quản trị về mặt hành chính"? Làm thế nào tôi thậm chí có thể đọc đầu ra của dòng đuôi bằng dòng trong một kịch bản shell?

Chỉnh sửa: Tôi nên giải thích rằng cờ -F cho đuôi không phải là tùy chọn cho tôi trên hệ thống này. Nó sử dụng một phiên bản đuôi khác không chứa tính năng này. Phiên bản hệ điều hành - Solaris 10

Trả lời

19

Bạn có thể sử dụng tùy chọn -F cho tail ngụ ý --follow=name --retry.

Từ man page:

-F  
The -F option implies the -f option, but tail will also check to see if the 
file being followed has been renamed or rotated. The file is closed and 
reopened when tail detects that the filename being read from has a new inode 
number. The -F option is ignored if reading from standard input rather than 
a file. 
+0

Tôi ước mình có thể sử dụng cờ này, nhưng phiên bản của tôi đuôi không có tính năng này và tôi không có tùy chọn để nâng cấp. (Không có quyền quản trị) – user1118047

+0

Bạn có thể vui lòng cung cấp 'thông tin phiên bản' của' đuôi' và 'hộp (unix/linux)' bạn đang sử dụng không? –

+1

SunOS 5.10 Không chắc chắn cách tìm phiên bản đuôi ... – user1118047

3

bạn có thể cần inotify để phát hiện sự sáng tạo của tập tin mới, một cách giải quyết cho rằng sẽ được giữ phiếu hệ thống tập tin trong khi chạy đuôi trên nền:

#!/bin/bash 

get_latest() { 
    local files=(*.log) 
    local latest=${files[${#files[@]}-1]} 
    echo "$latest" 
    [[ $latest == $1 ]] 
} 
run_tail() { 
    tail -c +0 -f "$1" 
} 

while true; do 
    while current=$(get_latest "$current"); do 
     sleep 1 
    done 
    [[ $pid ]] && kill $pid 
    run_tail "$current" & pid=$! 
done 

(chưa được kiểm tra, không thường xuyên bị hack và cẩn thận với những hạn chế của hệ thống cũ của bạn!)

+1

Tôi thích nơi mà câu trả lời này sẽ ... Tôi đã không thể plug-and-play quyền này vào một kịch bản shell và có nó làm những gì tôi muốn, nhưng tôi sẽ chơi xung quanh với mã ở đây và xem những gì tôi có thể làm để làm cho nó hoạt động. – user1118047