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.)

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.


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.


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.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.