Comando Shell per monitorare le modifiche in un file - Come si chiama di nuovo?


160

So che c'era un comando su Unix che potevo usare per monitorare un file e vedere le modifiche che vi venivano scritte. Ciò è stato molto utile soprattutto per il controllo dei file di registro.

Sai come si chiama?

Risposte:


214

Vuoi dire

tail -f logfile.log

?

( Pagina man per coda )


6
Sì, è tempo reale.
Adam Gibbins,

18
Sidenote: se la tua distribuzione fornisce il comando tailf, usa quello preferibilmente tail -f. tailf è più efficiente perché non ha bisogno di accedere al file guardato se non è stato scritto (gli accessi al sondaggio sono fastidiosi se hai montato il file system con l'aggiornamento atime.)
Mihai Limbăşan

10
A super-utente che ho trovato una risposta raccomandare tail -f invece di -f , troppo
Rafa

17
tail -Fseguirà i nomi dei file anziché gli oggetti file, il che è particolarmente utile in caso di rotazione dei file di registro.
Amir Ali Akbari,

2
Aggiornamento, qualche anno dopo: tailfora è deprecato ed tail -fè sicuro. (confermalo sul tuo sistema con man tailf.) Vedi documentazione: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

Probabilmente intendevi coda, secondo la risposta di Jon Skeet.

Un altro utile è watch ; ti permette di eseguire periodicamente un comando e vedere l'output a schermo intero. Per esempio:

guarda -n 10 -d ls -l / var / adm / message

Eseguirà il comando ls -l /var/adm/messagesogni 10 secondi ed evidenzierà la differenza nell'output tra le esecuzioni successive. (Utile per vedere quanto velocemente sta crescendo un file di registro, per esempio).


38

inotifywaitda inotify-tools è utile se si desidera eseguire un comando ogni volta che un file (o qualsiasi file in una directory) cambia. Per esempio:

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

Solo una nota che pathnon è la scelta migliore per un nome di variabile. Acceso zsh, sembra che l'ambiente non sia sensibile al maiuscolo / minuscolo. Per me, l'impostazione pathcausa PATHanche l'impostazione, e ciò significa sostanzialmente che nulla verrà eseguito finché non lo risolvi. On bash, l'impostazione pathnon ha alcun effetto su PATH.
Thanatos,

36

Preferisco usare less +FG1 su tail -fperché mi trovo a dover cercare un file di registro per un errore o un ID specifico. Se devo cercare qualcosa, scrivo ^Cper smettere di seguire il file e ?iniziare la ricerca all'indietro.

Le combinazioni di tasti sono praticamente le stesse di vi. Qualsiasi comando può essere inizializzato all'avvio utilizzando l' +opzione:

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

Per i registri molto lunghi, trovo conveniente usare l' -nopzione che disattiva la numerazione delle righe. Dalla manpage:

-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 a rgmarcha per averlo sottolineato nei commenti.


Ricorda di impostare un aliascon le opzioni desiderate, in modo da non doverle digitare ogni volta.
Michael Hampton

In realtà, nella maggior parte dei casi dovresti preferire le funzioni di shell rispetto agli alias.
triplo

21

La coda è fantastica ... meno può anche essere usato inizia meno sul file, cioè meno myfile quindi premi Shift+ F. Questo ha meno effetto come coda.


5
less + F myfile lo farà anche
rgmarcha,

16

Sto modificando un file LaTeX e volevo monitorarlo anche per le modifiche da qualche parte nel mezzo. Ho preparato il seguente piccolo script di shell che mi è stato utile. Spero che possa tornare utile anche a qualcun altro.

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

Salvalo come watch.she fai chmod u+x watch.sh. Quindi lo eseguo come segue:

./watch.sh file.tex pdflatex

Se si desidera eseguire il comando solo in caso di modifica effettiva, è possibile utilizzare `md5sum "$FILE"`invece di `ls -l "$FILE"`.


1
per guardare le directory e i loro contenuti anziché un singolo file:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy,


6

Puoi anche usare inotifywatch / inotifywait che si aggancia al sottosistema di kernel inotify. In questo modo puoi anche cercare cose come "apri", "chiudi" o "accedi".

Ma se vuoi semplicemente ottenere linee aggiunte a stdout, sono d'accordo sulla coda.


3

Tail è lo strumento unix standard, tradizionale, disponibile ovunque. Uno strumento un po 'più sofisticato è il multitail in grado di monitorare più file contemporaneamente e di evidenziare la sintassi.


3

Se voglio essere in grado di cercare nel file oltre a limitarlo, ne uso meno con il comando "F".

Quando si utilizza tail, tenere presente che sono necessari argomenti aggiuntivi se il file potrebbe essere sottoposto a rollover o sostituito da edit (modalità predefinita per vim: w).

tail -f farà in modo che tail memorizzi il descrittore di file e lo segua. Se il file viene sostituito, il descrittore verrà modificato. Il vantaggio di seguire il descrittore di file è che se il file viene rinominato, lo seguirai comunque.

tail --follow = farà in modo che tail segua il file indicato riaprendolo periodicamente per vedere se è stato sostituito.

--retry è un'altra opzione utile se si desidera personalizzare un file di registro ma il file non è stato ancora creato.

tail -F è una scorciatoia per --follow = --retry.


2

Dimentica tailf, diff è il comando che desideri. Ecco un buon trucco per osservare le differenze che si verificano in tempo reale (o vicino) tra 2 file o in cui un file viene scritto.

È possibile utilizzare questi metodi per modificare il comportamento nel modo desiderato, ad esempio scrivere le modifiche in un file per conservare la registrazione. Gioca con l'intervallo di controllo o altre opzioni per i comandi seguenti.

Hai 1 file e vuoi vederlo mentre vengono apportate modifiche:

Quindi ecco cosa fare:

  1. copia il file

cp file file2

  1. scrivere uno script bash per trovare le differenze e aggiornare file2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Ecco un'idea di base per la sceneggiatura. Fallo scrivere su un file se vuoi

#!/bin/bash

diff file file2

cp file file2

  1. Successivamente puoi guardare le differenze sullo schermo usando watch

watch ./check-differences

questo verrà aggiornato ogni 2 secondi per impostazione predefinita. Quindi, se è necessario tornare indietro e leggerli, scrivere l'output di diff in un file nello script.

oppure usa cron per eseguire regolarmente lo script se non hai bisogno di vedere l'output.


1

Mentre tail -f somefile.txtcontinuo a scorrere con nuovi dati, a volte preferisco less +G somefile.txtanche guardare una patch degli ultimi dati nel file.


4
Penso che sia tutto compreso in questa risposta di 7 anni fa.
Kasperd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.