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.
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.)
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).
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.
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"`.
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.
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.
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.
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:
salin file
cp file file2
tulis skrip bash untuk menemukan perbedaannya, dan perbarui file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
Inilah ide dasar untuk skrip. Buat itu menulis ke file jika Anda mau
#!/bin/bash
diff file file2
cp file file2
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.
Sambil tail -f somefile.txtterus menggulir dengan data baru, kadang-kadang saya lebih suka less +G somefile.txtjuga melihat tambalan data terbaru dalam file.
tail -F
akan mengikuti nama file daripada objek file, yang sangat berguna dalam kasus rotasi file log.tailf
sekarang sudah usang dantail -f
aman. (konfirmasikan ini pada sistem Anda denganman tailf
.) Lihat dokumentasi: man7.org/linux/man-pages/man1/tailf.1.htmlAnda 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:
Akan menjalankan perintah
ls -l /var/adm/messages
setiap 10 detik, dan menyoroti perbedaan dalam output antara proses selanjutnya. (Berguna untuk menonton seberapa cepat logfile tumbuh, misalnya).sumber
inotifywait
dari inotify-tools berguna jika Anda ingin menjalankan perintah setiap kali file (atau file apa pun dalam direktori) berubah. Sebagai contoh:sumber
path
bukan pilihan terbaik untuk nama variabel. Padazsh
, tampaknya vars lingkungan tidak peka terhadap huruf besar-kecil. Bagi saya, pengaturanpath
penyebabPATH
juga bisa diatur, dan itu pada dasarnya berarti tidak ada yang akan dijalankan sampai Anda memperbaikinya. Aktifbash
, pengaturanpath
tidak berpengaruh aktifPATH
.Saya lebih suka menggunakan
less +FG
1 lebihtail -f
karena saya merasa perlu mencari file log untuk kesalahan atau ID tertentu. Jika saya perlu mencari sesuatu, saya ketik^C
untuk berhenti mengikuti file dan?
mulai mencari mundur.Binding kunci hampir sama dengan di
vi
. Perintah apa pun dapat diinisialisasi pada startup menggunakan+
opsi:Untuk log yang sangat panjang, saya merasa nyaman untuk menggunakan
-n
opsi yang mematikan penomoran baris. Dari halaman manual:1. Hat-tip ke rgmarcha untuk menunjukkan ini di komentar.
sumber
alias
dengan opsi yang Anda inginkan, jadi Anda tidak perlu mengetiknya setiap saat.Ekornya bagus ... kurang juga bisa digunakan mulai lebih sedikit pada file yaitu kurang myfile lalu tekan Shift+ F. Ini kurang bertindak sebagai ekor.
sumber
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.
Simpan sebagai
watch.sh
dan lakukanchmod 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"`
.sumber
NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Anda dapat menggunakan perintah tailf yang paling mudah
sumber
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.
sumber
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.
sumber
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.
sumber
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:
cp file file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
#!/bin/bash
diff file file2
cp file file2
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.
sumber
Sambil
tail -f somefile.txt
terus menggulir dengan data baru, kadang-kadang saya lebih sukaless +G somefile.txt
juga melihat tambalan data terbaru dalam file.sumber