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.