2011-12-27 19 views
15

Üzerinde kuyruk kullanabilmek için istiyorum haddeleme günlük dosyaları tam bir dizin var.Atık Rolling Dosyalar

dosyalarında, gibi adlandırılır: Eski bir unix sisteminde

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 

, ben bir kabuk ile gelip çalışıyorum o kuyruk belirli bir dizin en son değiştirilen dosyayı yapacak, ve eğer Bu dosya idari olarak kapatılır (bir sonraki dosyaya geçer). Programın, yeniden çalıştırılmak üzere kuyruktan çıkmaya gerek kalmadan otomatik olarak yeni dosyayı taramaya başlamasını istiyorum. Yukarıdaki dosya adları verilen

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

istenen davranış

, böyle gider:

./logtailer.sh 

Sonra komut 00D.txt atık başlayacaktı. Kaydedici 00D.txt'ye yazmayı bitirdiğinde ve en yeni günlük dosyası şimdi 00E.txt olarak adlandırıldıysa, program otomatik olarak bu dosyaya başlıyordu.

Bir metin için "Dosya İdari Kapalı" kuyruk çıkışını izliyor ve sonra tekrar aşağıdaki komutu çalıştırmak suretiyle bu senaryo yazmaya başladı.

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

Bunu, "dosya yönetimsel olarak kapatılmış" metin izleyerek yapmaktan daha şık bir yolu var mı? Bir kuyruk senaryosunda kuyruk hattının çıktısını nasıl okuyabilirim?

Düzenleme: kuyruk için -F seçeneğinin bu sistemde benim için bir seçenek olmadığını açıklamalıdır. Bu özelliği içermeyen farklı bir kuyruk sürümü kullanır. İşletim sistemi sürümü - Solaris 10

cevap

19

tail için -F seçeneğini kullanarak --follow=name --retry anlamına gelir. man sayfasından

:

-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

ama benim sürüm kuyruk bu özelliği yok ve bunu yükseltme seçeneği yok. (Hayır yönetici hakları) – user1118047

+0

Eğer 'tail' ve' kutusu (unix/linux) arasında 'versiyonu info' verir misiniz' kullanıyorsunuz? –

+1

SunOS 5.10 Kuyruk versiyonunu nasıl bulacağınızdan emin değilsiniz ... – user1118047

3

Eğer yeni bir dosya oluşturulmasını algılamak için inotify gerekebilir, bunun için bir çözüm zemin üzerine kuyruk çalışırken taramayı dosya sistemini tutmak olacaktır:

#!/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 

(denenmemiş, unnecesarily hacky ve eski sistemin sınırlamalar dikkatli olun!)

Ben bu bayrağı kullanabilirler isterdim
+1

Bu cevabın nereye gittiğini beğeniyorum ... Bu komut dosyasını bir kabuk betiğine ekleyemedim. ve istediğimi yap, ama ben burada kodla oynayacağım ve çalışmasını sağlamak için neler yapabileceğimi göreceğim. – user1118047