“Tail” komutunun “-f” parametresi nasıl çalışır?


59
$ tail -f testfile

komutun belirtilen dosyadaki en son girişleri gerçek zamanlı olarak göstermesi mi gerekiyor? Ama bu olmuyor. Lütfen beni düzeltin, yapmayı düşündüğüm şey yanlışsa ...

Yeni bir dosya "aaa" oluşturdum ve bir satırlık metin ekledim ve kapattım. sonra bu komutu (ilk satır) verdi:

$ tail -f aaa
xxx
xxa
axx

son üç satır aaa dosyasının içeriğidir. Artık komut hala çalışıyor (kullandığımdan beri -f), aaa dosyasını GUI üzerinden açtım ve manuel olarak birkaç satır daha eklemeye başladım. Ancak terminal dosyaya eklenen yeni satırları göstermiyor.

Neyin var burada? tail -fOnlar sadece sistem tarafından yazılır eğer komut yalnızca yeni girişleri gösterir? (günlük dosyaları vb. gibi)

Yanıtlar:


62

Gönderen tail(1) adam sayfası :

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

Metin düzenleyiciniz orijinal dosyayı yeniden adlandırıyor veya siliyor ve yeni dosyayı aynı dosya adıyla kaydediyor. Yerine -Fkullanın.


çalıştı! Yani, $ tail -F filenameemri yerine her zaman komutu kullanabilir miyim $ tail -f filename?
its_me

17
Eğer bu senin amacın değil mi? Orada olabilir Eğer dosya ismi yerine tanımlayıcı tarafından takip istediğiniz durumlar olabilir, ancak bu pek rastlamak değil adil olmak.
Ignacio Vazquez-Abrams,

lsofbu olayı gösterebilir - örneğin lsof -Fpcftni, izlenen inode'un tailartık editörün açtığı aynı olmadığını gösterir.
Aaron D. Marasco

10

Editörünüzün dosya için kendi tamponu var. Editördeki metni değiştirdiğinizde, dosyanın kendisine hiçbir şey yazılmaz.

Değişikliklerinizi kaydettiğinizde, editörün eski dosyayı silmesi ve yeni bir tane oluşturması ihtimali vardır. tail -fhala silinen dosyaya bağlanacak, bu yüzden yeni bir şey göstermeyecek.


1
Editör dosyanın üzerine yazar, günlükler metni ekler. Bu belki sorun olabilir.
Rufo El Magufo

@Juan: Yorumunu anlamıyorum. "üzerine yaz" cevabımda açıklanan dışında hiçbir somut anlamı yoktur.
Stéphane Gimenez

Evet, aynısını demek istedim :)
Rufo El Magufo

3

tail varsayılan olarak her 1 saniyede "yenile", gerçek zamanlı değil.

Bunu dene (bash4'e ihtiyacınız var):

  • 2 terminal açın.
  • İlk terminalde touch ~/output.txtve tail -f ~/output.txt.
  • İkinci terminalde yürütmek for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • İlk terminaldeki kuyruk çıkışına bakın.

Bunu mu demek istediniz echo $i >> ~/output.txt? Ayrıca, bu cevap sorunun amacını özlüyor.
Ignacio Vazquez-Abrams

1
Evet, sen yorum yazarken hatayı düzelttim :). Cevabım sadece problemin testidir tail -f komutu sadece sistem tarafından yazılmışlarsa sadece yeni girişleri mi gösterir?
Rufo El Magufo

4
@Juan: Bugünlerde, linux'da, inotify tailftabanlı bir uygulama var. Böylece gerçek zamanlı olarak yenilenir.
Stéphane Gimenez

Evet tailf, ancak tailinotify kullanıyor mu? Bilmiyordum tailf. Kuyruğun manpage için 1 saniye varsayılanını gösterir -s.
Rufo El Magufo

3
Evet, tailizledim ve şimdi de uygun olduğunda da inotify kullanıyor. tailfhiç oy kullanmadı, sadece dosyada hiçbir etkinlik olmadığında uyuyor. tail -fbazı aktiviteler gösterir ( straceçıktıya bakınız ).
Stéphane Gimenez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.