Perintah Shell untuk memantau perubahan dalam file - Apa namanya lagi?


159

Saya tahu ada perintah di Unix yang bisa saya gunakan untuk memonitor file dan melihat perubahan yang sedang ditulis. Ini cukup berguna terutama untuk memeriksa file log.

Apakah Anda tahu apa namanya?

Jawaban:


213

Maksud kamu

tail -f logfile.log

?

( Halaman manual untuk ekor )


6
Ya, ini real time.
Adam Gibbins

18
Sidenote: Jika distribusi Anda memberikan perintah tailf, gunakan itu sebagai preferensi untuk tail -f. tailf lebih efisien karena tidak perlu mengakses file yang ditonton jika tidak ditulis (akses jajak pendapat mengganggu jika Anda memasang sistem file dengan atime memperbarui.)
Mihai Limbăşan

10
Di pengguna super saya menemukan jawaban merekomendasikan ekor -F bukan -f juga
Rafa

17
tail -Fakan mengikuti nama file daripada objek file, yang sangat berguna dalam kasus rotasi file log.
Amir Ali Akbari

2
Perbarui, beberapa tahun kemudian: tailfsekarang sudah usang dan tail -faman. (konfirmasikan ini pada sistem Anda dengan man tailf.) Lihat dokumentasi: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

Anda mungkin berarti ekor, sesuai jawaban Jon Skeet.

Satu lagi yang bermanfaat adalah jam tangan ; ini memungkinkan Anda untuk menjalankan perintah secara berkala dan melihat output layar penuh. Sebagai contoh:

watch -n 10 -d ls -l / var / adm / messages

Akan menjalankan perintah ls -l /var/adm/messagessetiap 10 detik, dan menyoroti perbedaan dalam output antara proses selanjutnya. (Berguna untuk menonton seberapa cepat logfile tumbuh, misalnya).


38

inotifywaitdari inotify-tools berguna jika Anda ingin menjalankan perintah setiap kali file (atau file apa pun dalam direktori) berubah. Sebagai contoh:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

Hanya catatan yang pathbukan pilihan terbaik untuk nama variabel. Pada zsh, tampaknya vars lingkungan tidak peka terhadap huruf besar-kecil. Bagi saya, pengaturan pathpenyebab PATHjuga bisa diatur, dan itu pada dasarnya berarti tidak ada yang akan dijalankan sampai Anda memperbaikinya. Aktif bash, pengaturan pathtidak berpengaruh aktif PATH.
Thanatos

36

Saya lebih suka menggunakan less +FG1 lebih tail -fkarena saya merasa perlu mencari file log untuk kesalahan atau ID tertentu. Jika saya perlu mencari sesuatu, saya ketik ^Cuntuk berhenti mengikuti file dan ?mulai mencari mundur.

Binding kunci hampir sama dengan di vi. Perintah apa pun dapat diinisialisasi pada startup menggunakan +opsi:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

Untuk log yang sangat panjang, saya merasa nyaman untuk menggunakan -nopsi yang mematikan penomoran baris. Dari halaman manual:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Hat-tip ke rgmarcha untuk menunjukkan ini di komentar.


Ingatlah untuk mengatur aliasdengan opsi yang Anda inginkan, jadi Anda tidak perlu mengetiknya setiap saat.
Michael Hampton

Sebenarnya, Anda umumnya harus lebih memilih fungsi shell daripada alias dalam kebanyakan kasus.
tripleee

21

Ekornya bagus ... kurang juga bisa digunakan mulai lebih sedikit pada file yaitu kurang myfile lalu tekan Shift+ F. Ini kurang bertindak sebagai ekor.


5
kurang + F myfile akan membuatnya terlalu
rgmarcha

16

Saya sedang mengedit file LaTeX dan ingin memonitornya juga untuk perubahan di suatu tempat di tengah. Saya membuat skrip shell kecil berikut yang terbukti bermanfaat bagi saya. Saya harap ini juga berguna bagi orang lain.

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

Simpan sebagai watch.shdan lakukan chmod u+x watch.sh. Kemudian saya jalankan sebagai berikut:

./watch.sh file.tex pdflatex

Jika Anda ingin perintah hanya dijalankan jika modifikasi yang sebenarnya terjadi, Anda dapat menggunakan `md5sum "$FILE"`sebagai gantinya `ls -l "$FILE"`.


1
untuk menonton direktori dan isinya alih-alih satu file:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy


6

Anda juga dapat menggunakan inotifywatch / inotifywait yang menghubungkan ke kernel subsistem inotify. Dengan cara ini Anda juga dapat menonton hal-hal seperti "terbuka", "tutup" atau "akses".

Tetapi jika Anda hanya ingin mendapatkan baris ditambahkan ke stdout saya setuju.


3

Ekor adalah alat unix standar, tradisional, tersedia di mana-mana. Alat yang sedikit lebih canggih adalah multitail yang dapat memonitor beberapa file secara bersamaan dan melakukan penyorotan sintaksis.


3

Jika saya ingin dapat mencari di sekitar file selain hanya tailing, saya menggunakan lebih sedikit dengan perintah "F".

Saat menggunakan tail, perlu diingat bahwa argumen tambahan diperlukan jika file mungkin berguling atau diganti dengan edit (mode default untuk vim's: w).

tail -f akan menyebabkan tail untuk menyimpan deskriptor file dan mengikutinya. Jika file diganti, deskriptor akan diubah. Manfaat mengikuti deskriptor file adalah jika file diubah namanya, Anda masih akan mengikutinya.

tail --follow = akan membuat ekor melacak file yang dinamai dengan membuka kembali secara berkala untuk melihat apakah telah diganti.

--retry adalah pilihan lain yang berguna jika Anda ingin mengekstrak file log tetapi file tersebut belum dibuat.

tail -F adalah jalan pintas untuk --follow = --retry.


2

Lupakan tailf, diff adalah perintah yang Anda inginkan. Berikut ini adalah trik yang bagus untuk melihat perbedaan yang terjadi secara real time (atau menutup) antara 2 file atau dalam satu file yang sedang ditulis.

Anda dapat menggunakan metode ini untuk mengubah perilaku dengan cara apa pun yang Anda inginkan, seperti menulis perubahan pada file untuk disimpan. Bermain-main dengan interval jam tangan atau opsi lain untuk perintah di bawah ini.

Anda memiliki 1 file dan Anda ingin menonton karena perubahan dibuat untuk itu:

Jadi, inilah yang harus dilakukan:

  1. salin file

cp file file2

  1. tulis skrip bash untuk menemukan perbedaannya, dan perbarui file2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Inilah ide dasar untuk skrip. Buat itu menulis ke file jika Anda mau

#!/bin/bash

diff file file2

cp file file2

  1. Selanjutnya Anda dapat menonton perbedaan di layar menggunakan arloji

watch ./check-differences

ini akan diperbarui setiap 2 detik secara default. Jadi jika Anda perlu kembali dan membacanya, maka tuliskan output diff ke file dalam skrip.

atau gunakan cron untuk menjalankan skrip Anda secara teratur jika Anda tidak perlu melihat hasilnya.


1

Sambil tail -f somefile.txtterus menggulir dengan data baru, kadang-kadang saya lebih suka less +G somefile.txtjuga melihat tambalan data terbaru dalam file.


4
Saya pikir itu semua tercakup dalam jawaban ini dari 7 tahun yang lalu.
kasperd
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.