`tail -f` terkadang berhenti memperbarui - dan file belum dipindahkan

10

Saya perhatikan baru-baru ini bahwa kadang-kadang tail -f <logfile>akan berhenti memperbarui ke layar.

Namun, melakukan Ctrl>- Cdan memulai kembali tailberfungsi dengan baik. Dan saya memeriksa untuk memastikan file log tidak diputar tengah (yang dapat membuat tailkehilangan akal sehat).

Apa yang menyebabkan ini? Saya menjalankan RHEL 5.2 x64.

warren
sumber
Apakah ini terjadi pada semua file log, atau hanya yang tertentu? Sistem file apa yang digunakan untuk logfile? Aplikasi apa yang menulis file log? Sudahkah Anda menghitung waktu kegagalan untuk melihat apakah itu terjadi baik (1) periode waktu tertentu setelah Anda memulai perintah ekor; atau (2) pada interval tetap tertentu (mis. selalu pada: 00: 10: 20: 30: 40 dan: 50 setelah jam kerja)?
daveadams
@daveadams - sejauh yang saya perhatikan, hanya ada dua (satu di setiap dua server): dalam hal ini, dataminer logfile untuk BSAE (alat pelaporan) pada server Core HPSA (otomatisasi pusat data) dan server.log untuk BSAE pada host pelaporan
warren
1
sebagai tambahan, tail -F akan terus bekerja bahkan jika file tersebut dihapus dan kemudian diganti oleh file lain sepenuhnya.
Sirex

Jawaban:

6

Coba lilitkan perintah ekor straceAnda jika Anda memilikinya:

strace -Tt -o /tmp/tail.trace tail -f /var/log/messages

Kemudian hanya untuk tendangan rekursif gila, Anda dapat mengekstraksi output strace (tidak masalah jika itu rusak karena akan keluar ke file):

 tail -f /tmp/tail.trace

Tambang saya terlihat seperti:

8:39:00 write(1, "ng SMAC\n", 8)       = 8 <0.000026>
18:39:00 read(3, "", 0)                 = 0 <0.000019>
18:39:00 fstat64(3, {st_mode=S_IFREG|0640, st_size=92990, ...}) = 0 <0.000019>
18:39:00 fstatfs64(3, 84, {f_type="EXT2_SUPER_MAGIC", f_bsize=4096, f_blocks=4807069, f_bfree=1924458, f_bavail=1680271, f_files=1221600, f_ffree=820806, f_fsid={-1331083162, -1313908385}, f_namelen=255, f_frsize=4096}) = 0 <0.000021>
18:39:00 inotify_init()                 = 4 <0.000033>
18:39:00 inotify_add_watch(4, "/var/log/messages", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1 <0.000041>
18:39:00 fstat64(3, {st_mode=S_IFREG|0640, st_size=92990, ...}) = 0 <0.000019>
18:39:00 read(4,

-T Mengaktifkan waktu dan -T mengaktifkan waktu yang dihabiskan dalam panggilan.

Tekan balik 4 atau 5 kali untuk membuat sedikit ruang vertikal, lalu tunggu sampai tailing berhenti. Semoga akan ada beberapa petunjuk dalam output.

davey
sumber
9

Coba gunakan:

tail --follow=name <logfile>

Dan lihat apakah itu bekerja lebih baik. Anda tidak perlu khawatir itu diputar keluar dari bawah Anda.


Apa ada pola untuk menghentikannya? Lamanya waktu tertentu? Waktu tertentu?

MikeyB
sumber
file tidak diputar keluar dari bawah tail- hanya saja secara berkala (sekitar 2 sampai 20 jam) berhenti untuk mengikuti lagi .. berharap ada lebih dari pola: - \
warren
Jika Anda menekan tombol lain pada keyboard (selain ctrl-c) apakah akan lebih baik? Ketika berhenti, Anda bisa mencoba melampirkannya menggunakan strace / ltrace / dll. untuk melihat apakah ia melakukan sesuatu.
MikeyB
pemikiran yang baik pada strace - baik masuk maupun kunci lainnya tidak akan terjadi apa-apa; Saya kadang-kadang suka membiarkan tail-f berjalan dalam screensesi untuk debugging yang diperpanjang, dan ini mengkhawatirkan
warren
1
Ah ... mungkin bukan masalah Anda, tetapi pastikan Anda tidak sengaja membiarkan jendela layar terbuka dalam mode salin dengan tail -f berjalan. Mode salin akan membuat blok keluaran perintah akhirnya (ketika buffer terisi).
MikeyB
Jawaban yang sangat bagus. Tentu saja file saya diputar keluar di bagian atas setiap jam!
alex
4

Mengingat bahwa kedua file log bermasalah ditulis oleh komponen yang berbeda dari aplikasi yang sama, saya bertanya-tanya apakah itu bukan bagian dari kode logging untuk aplikasi yang menyebabkan masalah. Saya mengusulkan dua tes untuk mendapatkan ide yang lebih baik tentang apa yang terjadi:

  • Catat inode dari file log ( ls -i logfile) sebelum memulai tail, dan begitu tail gagal, periksa lagi. Jika inode telah berubah, maka logger sedang menulis ulang seluruh file log, yang akan memutuskan koneksi tail.

  • Catat baris terakhir sebelum tail berhenti bekerja, dan kemudian kunjungi file dan temukan entri log pertama setelah baris itu. Lakukan ini 3-5 kali jika memungkinkan. Jika ada masalah dengan program yang melakukan logging, bagian dari program yang menulis entri log segera setelah Anda melihat istirahat kemungkinan besar bertanggung jawab. Jika entri log itu selalu sama, atau jika itu berasal dari komponen program yang sama, Anda mungkin memiliki cukup data untuk mengirimkan laporan masalah ke vendor aplikasi.

Semoga berhasil.

daveadams
sumber
3

Memiliki masalah yang sama di sini.

Masalahnya adalah, bahwa file yang saya tonton dipasang dari mesin yang berbeda. Pemberitahuan perubahan tidak disebarkan melalui mount.

Solusi adalah dengan menggunakan ekor pada mesin asli.

Stephan Hoyer
sumber