Comandă Shell pentru a monitoriza modificările într-un fișier (Administrarea sistemului, Linux, Shell)

Sebastian Hoitz a intrebat.

Știu că exista o comandă pe Unix pe care o puteam folosi pentru a monitoriza un fișier și a vedea modificările care se scriu în el. Acest lucru era destul de util mai ales pentru verificarea fișierelor de jurnal.

Știți cum se numește?

13 răspunsuri
Jon Skeet

Vă referiți la

tail -f logfile.log

?

(Pagina de manual pentru tail)

Comentarii

  • Da, este în timp real. –  > Por Adam Gibbins.
  • 19

  • Notă secundară: Dacă distribuția dvs. oferă comanda tailf, folosiți-o de preferință față de tail -f. tailf este mai eficient deoarece nu trebuie să acceseze fișierul supravegheat dacă nu se scrie în el (accesările de tip poll sunt enervante dacă ați montat sistemul de fișiere cu actualizare atime). –  > Por Mihai Limbășan.
  • La super user am găsit un răspuns care recomandă tail -F în loc de -f , de asemenea –  > Por Rafa.
  • 19

  • tail -F va urmări mai degrabă numele de fișiere decât obiectele de fișiere, ceea ce este util în special în cazul rotației fișierelor jurnal. –  > Por Amir Ali Akbari.
  • Actualizare, câțiva ani mai târziu: tailf este acum depreciat și tail -f este sigură. (confirmați acest lucru pe sistemul dvs. cu man tailf.) Consultați documentația: man7.org/linux/man-pages/man1/tailf.1.html –  > Por exp1orer.
Murali Suriar

Probabil ați vrut să spuneți tail, conform răspunsului lui Jon Skeet.

Un alt util este watch; vă permite să rulați periodic o comandă și să vedeți ieșirea pe tot ecranul. De exemplu:

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

Va rula comanda ls -l /var/adm/messages la fiecare 10 secunde și va evidenția diferența dintre ieșirile ulterioare. (Util pentru a urmări cât de repede crește un fișier jurnal, de exemplu).

richvdh

inotifywait de la inotify-tools este utilă dacă doriți să executați o comandă de fiecare dată când un fișier (sau orice fișier dintr-un director) se modifică. De exemplu:

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

Comentarii

  • Doar o notă că path nu este cea mai bună alegere pentru un nume de variabilă. Pe zsh, , se pare că variabilele de mediu nu sunt sensibile la majuscule și minuscule. Pentru mine, setarea path provoacă PATH să fie de asemenea setată, ceea ce înseamnă că nimic nu se va executa până când nu se rezolvă această problemă. Pe bash, , setarea path nu are niciun efect asupra PATH. –  > Por Thanatos.
  • @Thanatos Variabile Zsh sunt sensibile la majuscule și minuscule, dar printre variabilele setate de Zsh însuși, Zsh „leagă” pe cele *PATH variabilele la un array cu același nume, dar minusculă. Variabilele legate constau întotdeauna dintr-un scalar și un array (de exemplu PATH și path), iar modificarea uneia dintre ele o modifică pe cealaltă. O caracteristică esențială este faptul că versiunea de matrice este împărțită automat pe separatorul din versiunea scalară (simbolul :). Vedeți cu ochii voștri cu print "$PATH
    $path"
    . Al doilea paragraf din PARAMETERS USED BY THE SHELL din secțiunea zshparam(1) din pagina de manual conține informații mai detaliate. –  > Por ZeroKnight.
  • Ca o notă suplimentară, există destul de multe variabile folosite de Zsh care sunt legate, nu doar PATH și path. Acestea sunt toate enumerate în secțiunea din comentariul meu anterior, inclusiv, dar nu numai: FPATH/fpath, , CDPATH/cdpath, , MANPATH/manpath, , FIGNORE/fignore, , și multe altele. –  > Por ZeroKnight.
Jon Ericson

Prefer să folosesc less +FG1 în loc de tail -f deoarece mă văd nevoit să caut un fișier jurnal pentru o anumită eroare sau ID. Dacă am nevoie să caut ceva, tastez ^C pentru a opri urmărirea fișierului și ? pentru a începe căutarea în sens invers.

Legăturile de taste sunt cam aceleași ca în vi. Orice comandă poate fi inițializată la pornire cu ajutorul comenzii + opțiune:

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

Pentru jurnalele foarte lungi, mi se pare convenabil să folosesc opțiunea -n care dezactive numerotarea liniilor. Din pagina de 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 către rgmarcha pentru că a semnalat acest lucru în comentarii.

Comentarii

  • Nu uitați să setați un alias cu opțiunile dorite, astfel încât să nu trebuiască să le introduceți de fiecare dată. –  > Por Michael Hampton.
  • De fapt, ar trebui să preferați, în general, funcțiile de shell în locul aliasurilor în majoritatea cazurilor. –  > Por tripleee.
  • Aș dori să știu de ce +FG în loc de +F? –  > Por Steven Lu.
trent

Tail este grozav … less poate fi de asemenea utilizat începeți less pe fișier, adică less myfile apoi apăsați Shift+F. Astfel, less acționează ca o coadă.

Comentarii

  • less +F fișierul meu va face și el –  > Por rgmarcha.
oliphaunt

Editez un fișier LaTeX și am vrut să-l monitorizez și pentru modificări undeva la mijloc. Am pus la cale următorul mic script shell care mi s-a dovedit util. Sper că va fi util și pentru altcineva.

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

Salvați-l ca watch.sh și faceți chmod u+x watch.sh. Apoi îl execut după cum urmează:

./watch.sh file.tex pdflatex

Dacă doriți ca comanda să fie executată doar dacă are loc o modificare efectivă, puteți folosi `md5sum "$FILE"` în loc de `ls -l "$FILE"`.

Comentarii

  • pentru a supraveghea directoarele și conținutul acestora în loc de un singur fișier: NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'` –  > Por Andy.
reegan vijay

puteți utiliza tailf comanda sa foarte simplă

tailf logfile.log

Martin

De asemenea, puteți utiliza inotifywatch/inotifywait, care se conectează la subsistemul inotify al nucleului. În acest fel, puteți urmări și lucruri precum „open”, „close” sau „access”.

Dar dacă doriți pur și simplu să obțineți linii adăugate la stdout, sunt de acord cu tail.

hlovdal

Tail este instrumentul unix standard, tradițional, disponibil peste tot. Un instrument puțin mai sofisticat este multitail care poate monitoriza mai multe fișiere simultan și face evidențierea sintaxei.

deinspanjer

Dacă vreau să pot căuta în jurul fișierului, pe lângă faptul că trebuie doar să îl urmăresc, folosesc less cu comanda „F”.

Atunci când utilizați tail, rețineți că sunt necesare argumente suplimentare dacă fișierul ar putea fi rulat sau înlocuit de edit (modul implicit pentru :w) de la vim).

tail -f va face ca tail să stocheze descriptorul de fișier și să îl urmărească. În cazul în care fișierul este înlocuit, descriptorul va fi modificat. Avantajul urmăririi descriptorului de fișier este că, dacă fișierul este redenumit, îl veți urmări în continuare.

tail –follow= va face ca tail să urmărească fișierul numit, redeschizându-l periodic pentru a vedea dacă a fost înlocuit.

–retry este o altă opțiune utilă dacă doriți să urmăriți un fișier jurnal, dar fișierul nu a fost încă creat.

tail -F este o prescurtare pentru –follow= –retry.

Mezmer

Uitați de tailf, diff este comanda pe care o doriți. iată un truc bun pentru a urmări diferențele pe măsură ce se întâmplă în timp real (sau aproape) între 2 fișiere sau într-un fișier în care se scrie.

Puteți folosi aceste metode pentru a modifica comportamentul în orice mod doriți, cum ar fi scrierea modificărilor într-un fișier pentru a păstra o evidență. Jucați-vă cu intervalul de watch sau cu alte opțiuni pentru comenzile de mai jos.

Aveți 1 fișier și doriți să urmăriți modificările care se fac în el:

Deci, iată ce trebuie să faceți:

  1. copiați fișierul

    cp file file2
    
  2. scrieți un script bash pentru a găsi diferențele și actualizați fișierul2

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. Iată o idee de bază pentru script. Fă-l să scrie într-un fișier dacă vrei

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. În continuare, puteți fie să urmăriți diferențele pe ecran folosind watch

    watch ./check-differences
    

acesta se va actualiza la fiecare 2 secunde în mod implicit. Deci, dacă aveți nevoie să vă întoarceți și să le citiți, atunci scrieți ieșirea din diff într-un fișier în script.

Sau folosiți cron pentru a rula scriptul în mod regulat dacă nu aveți nevoie să vedeți rezultatele.

phantomastray

În timp ce tail -f somefile.txt continuă să se deruleze cu date noi, eu uneori prefer less +G somefile.txt de asemenea să mă uit la un petic din ultimele date din fișier.

Comentarii

  • Cred că toate acestea sunt acoperite în acest răspuns de acum 7 ani. –  > Por kasperd.
T.Todua

Am folosit acest lucru, pentru a executa o funcție la schimbarea fișierului:

sudo apt-get install inotify-hookable
inotify-hookable -w ./my_dir_to_monitor  -c "mkdir blabla"

Tags:,