Bir dosyadaki değişiklikleri izlemek için Shell komutu - Tekrar ne denir?


159

Unix'te bir dosyayı izlemek ve ona yazılan değişiklikleri görmek için kullanabileceğim bir komut olduğunu biliyorum. Bu, özellikle günlük dosyalarını kontrol etmek için oldukça yararlı oldu.

Ne dendiğini biliyor musun?

Yanıtlar:


213

Demek istiyorsun

tail -f logfile.log

?

( Kuyruk için man sayfası )


6
Evet, gerçek zaman.
Adam Gibbins,

18
Sidenote: Eğer dağıtımınız tailf komutunu verirse, tail -f yerine tercihinizi kullanın. tailf daha verimlidir, çünkü eğer yazılı değilse izlenen dosyaya erişmesi gerekmez (dosya sistemini
atime

10
At süper kullanıcı bir cevap buldum tavsiye kuyruk -F yerine -f de
Rafa

17
tail -Fözellikle günlük dosyası döndürme durumunda yararlı olan dosya nesneleri yerine dosya adlarını izleyecektir.
Amir Ali Akbari

2
Güncelleme, birkaç yıl sonra: tailfartık kullanımdan kaldırıldı ve tail -fgüvende. (bunu sisteminizde onaylayın man tailf.) Belgelere bakın: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

Jon Skeet'in cevabına göre, muhtemelen kuyruk demek istedin.

Yararlı bir diğeri ise seyretmek ; düzenli aralıklarla bir komut çalıştırmanıza ve çıktının tam ekranını görmenize olanak sağlar. Örneğin:

-n 10 -d ls-l / var / adm / mesajları izle

ls -l /var/adm/messagesHer 10 saniyede bir komutu çalıştıracak ve sonraki işlemler arasındaki çıktıdaki farkı vurgulayacaktır. (Örneğin, bir günlük dosyasının ne kadar hızlı büyüdüğünü izlemek için kullanışlıdır).


38

inotifywaitdan Inotify-araçları bir komutunu bir dosya (veya dizin içinde herhangi bir dosya) değişim her zaman çalıştırmak istiyorsanız yararlıdır. Örneğin:

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

pathDeğişken adı için en iyi seçenek olmayan bir not . Açık zsh, ortam değişkenlerinin büyük / küçük harf duyarlı olmadığı görülüyor. Benim için, ayar yapmak da pathneden olur PATHve bu temelde siz bunu düzeltene kadar hiçbir şeyin yürütülmeyeceği anlamına gelir. Açık bash, ayarın pathetkisi yoktur PATH.
Thanatos

36

Ben kullanmayı tercih less +FG1 üzerinde tail -fkendimi belirli bir hata veya kimliği için bir günlük dosyası aramak gerek bulmak için. Bir şey ^Caramam gerekirse, dosyayı izlemeyi bırakıp ?geriye doğru aramaya başlamak için yazarım.

Anahtar bağlamaları, hemen hemen aynıdır vi. Herhangi bir komut, başlangıçta +seçenek kullanılarak başlatılabilir :

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

Uzun kayıtlar -niçin satır numaralandırmayı kapatan seçeneği kullanmayı uygun buluyorum . Manpage'den:

-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. Yorumlarda bunu işaret ettiği için rgmarcha'ya şapka ipucu .


aliasİstediğiniz seçeneklerle bir ayar yapmayı unutmayın, böylece her seferinde bunları yazmanıza gerek kalmaz.
Michael Hampton

Aslında, çoğu durumda kabuk takma işlevlerini takma adlara göre tercih etmelisiniz.
üçlü

21

Kuyruğu harika ... daha az kullanılabilir daha az dosyada daha az kullanılabilir yani, daha az dosyam daha sonra Shift+ tuşlarına basın F. Bu kuyruk gibi daha az harekete sahiptir.


5
daha az + F
myfile

16

Bir LaTeX dosyasını düzenliyorum ve ortadaki herhangi bir yerdeki değişiklikleri de izlemek istedim. Bana yararlı olduğunu kanıtlayan şu küçük kabuk senaryosunu hazırladım. Umarım bir başkası için de faydalı olur.

#!/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

Olarak kaydedin watch.shve yapın chmod u+x watch.sh. Sonra aşağıdaki gibi yürütüyorum:

./watch.sh file.tex pdflatex

Komutun yalnızca gerçek değişiklik olursa çalıştırılmasını istiyorsanız, `md5sum "$FILE"`bunun yerine kullanabilirsiniz `ls -l "$FILE"`.


1
tek bir dosya yerine dizinleri ve içeriklerini izlemek için:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy


6

Hangi çekirdeğe bağlı olan inotifywatch / inotifywait öğesini alt sistemi inotify olarak kullanabilirsiniz. Bu şekilde "açık", "yakın" veya "erişim" gibi şeyleri de izleyebilirsiniz.

Ama sadece stdout'a eklenmiş çizgiler elde etmek istiyorsanız kuyrukta aynı fikirdeyim.


3

Kuyruk standart, geleneksel, her yerde kullanılabilir unix aracıdır. Biraz daha karmaşık bir araç, birden fazla dosyayı aynı anda izleyebilen ve sözdizimi vurgulaması yapan çoklu görevdir .


3

Dosyayı taramanın yanı sıra dosyayı daha yakından incelemek istersem, "F" komutuyla daha az kullanıyorum.

Kuyruğu kullanırken, dosya yuvarlanıyorsa veya düzenlemeyle değiştiriliyorsa, ek argümanların gerekli olduğunu unutmayın (vimin: w için varsayılan mod).

tail -f, tail'ın dosya tanımlayıcısını depolamasına ve onu izlemesine neden olur. Dosya değiştirilirse, tanımlayıcı değişecektir. Dosya tanımlayıcısını takip etmenin faydası, dosya yeniden adlandırılırsa, hala onu izliyor olmanızdır.

tail --follow = kuyruğun değiştirilip değiştirilmediğini görmek için periyodik olarak yeniden açarak adlandırılmış dosyayı izlemesini sağlar.

- logry, bir günlük dosyasını yerleştirmek istiyorsanız ancak dosya henüz oluşturulmadıysa, başka bir kullanışlı seçenektir.

tail -F, --follow = --retry için bir kısayoldur.


2

Kuyruğu unutun, diff istediğiniz komuttur. İşte, 2 dosya arasında veya bir dosyada yazılmakta olan gerçek zamanlı (ya da yakın) farkları olduğu gibi izlemek için iyi bir püf noktası.

Bu yöntemleri, davranışı istediğiniz şekilde (örneğin, kayıtları saklamak için bir dosyaya yazmak gibi) değiştirmek için kullanabilirsiniz. Aşağıdaki komutlar için saat aralığı veya diğer seçeneklerle oynayın.

1 dosyanız var ve üzerinde değişiklik yapıldığı için izlemek istiyorsunuz:

Yani heres ne yapacağını:

  1. dosyayı kopyala

cp file file2

  1. farkları bulmak için bir bash betiği yazın ve file2 güncelleyin

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Heres senaryo için temel bir fikir. İsterseniz bir dosyaya yazmasını sağlayın

#!/bin/bash

diff file file2

cp file file2

  1. Ardından, saat kullanarak ekrandaki farkları izleyebilirsiniz.

watch ./check-differences

bu, varsayılan olarak her 2 saniyede bir güncellenir. Bu yüzden geri dönüp bunları okumak durumundaysanız, diff'in çıktısını komut dosyasındaki bir dosyaya yazın.

veya çıktıyı görmeniz gerekmiyorsa betiğinizi düzenli olarak çalıştırmak için cron kullanın.


1

tail -f somefile.txtYeni verilerle kaydırma yapmaya devam ederken bazenless +G somefile.txt dosyadaki en son veri düzeltme ekine bakmayı da tercih ederim .


4
Bence bunların hepsi 7 yıl öncesinden bu cevapta ele alınmıştır .
kasperd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.