Bagaimana cara parameter "tail" perintah "-f" bekerja?

59
$ tail -f testfile

perintah seharusnya menunjukkan entri terbaru dalam file yang ditentukan, secara real-time bukan? Tetapi itu tidak terjadi. Harap perbaiki saya, jika apa yang saya maksudkan salah ...

Saya membuat file baru "aaa" dan menambahkan satu baris teks dan menutupnya. kemudian mengeluarkan perintah ini (baris pertama):

$ tail -f aaa
xxx
xxa
axx

tiga baris terakhir adalah isi file aaa. Sekarang perintahnya masih berjalan (sejak saya gunakan -f), saya membuka file aaa melalui GUI dan mulai menambahkan beberapa baris lagi secara manual. Tetapi terminal tidak menunjukkan baris baru yang ditambahkan dalam file.

Ada apa di sini The tail -fperintah hanya menunjukkan entri baru jika mereka ditulis oleh sistem saja? (seperti file log, dll.)

ini aku
sumber

Jawaban:

62

Dari tail(1) halaman manual :

   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.

Editor teks Anda mengganti nama atau menghapus file asli dan menyimpan file baru di bawah nama file yang sama. Gunakan -Fsebagai gantinya.

Ignacio Vazquez-Abrams
sumber
bekerja! Jadi, saya bisa menggunakan $ tail -F filenameperintah sepanjang waktu, bukan $ tail -f filenamebenar?
its_me
17
Jika itu perilaku yang Anda maksudkan. Ada mungkin ada kasus di mana Anda ingin mengikuti dengan deskriptor bukan nama file, tapi untuk bersikap adil saya belum menemukan banyak dari mereka.
Ignacio Vazquez-Abrams
lsofdapat menunjukkan hal ini terjadi - misalnya lsof -Fpcftniakan menunjukkan bahwa inode yang diikuti tailtidak lagi sama dengan yang dibuka oleh editor.
Aaron D. Marasco
10

Editor Anda memiliki buffer sendiri untuk file tersebut. Saat Anda memodifikasi teks di editor, tidak ada yang ditulis ke file itu sendiri.

Saat Anda menyimpan perubahan, kemungkinan editor menghapus file lama dan membuat yang baru. tail -fmasih akan terhubung ke file yang dihapus, sehingga tidak akan menampilkan sesuatu yang baru.

Stéphane Gimenez
sumber
1
Editor menimpa file, log menambahkan teks. Ini mungkin masalahnya.
Rufo El Magufo
@Juan: Saya tidak mengerti komentar Anda. "menimpa" tidak memiliki arti konkret kecuali yang saya jelaskan dalam jawaban saya.
Stéphane Gimenez
Ya, maksud saya sama dengan Anda :)
Rufo El Magufo
3

tail "segarkan" setiap 1 detik secara default, bukan waktu nyata.

Coba dengan ini (Anda perlu bash4):

  • Buka 2 terminal.
  • Di terminal pertama jalankan touch ~/output.txtdan tail -f ~/output.txt.
  • Di terminal kedua jalankan for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Lihatlah output dari ekor di terminal pertama.
Rufo El Magufo
sumber
Apakah maksud Anda echo $i >> ~/output.txt? Juga, jawaban ini melewatkan inti pertanyaan.
Ignacio Vazquez-Abrams
1
Ya, saya memperbaiki kegagalan saat Anda menulis komentar :). Jawaban saya hanya sebuah tes untuk masalah. Perintah tail -f hanya menampilkan entri baru jika ditulis oleh sistem saja?
Rufo El Magufo
4
@Juan: Saat ini, di linux, tailfmemiliki implementasi berbasis inotify. Jadi itu akan menyegarkan secara realtime.
Stéphane Gimenez
Ya untuk tailf, tetapi tailmenggunakan inotify ?. Saya tidak tahu tailf. Halaman ekor menunjukkan default 1 detik untuk -s.
Rufo El Magufo
3
Ya, taildiikuti dan sekarang juga menggunakan notifikasi jika tersedia. tailfsama sekali tidak polling, hanya tidur, ketika tidak ada aktivitas pada file. tail -fmenunjukkan beberapa aktivitas (lihat straceoutput).
Stéphane Gimenez