Shell-Befehl zum Überwachen von Änderungen in einer Datei - Wie wird sie erneut aufgerufen?

159

Ich weiß, dass es unter Unix einen Befehl gab, mit dem ich eine Datei überwachen und Änderungen feststellen konnte, die darauf geschrieben werden. Dies war insbesondere zum Überprüfen von Protokolldateien sehr nützlich.

Weißt du, wie es heißt?

Sebastian Hoitz
quelle

Antworten:

213

Meinst du

tail -f logfile.log

?

( Manpage für Tail )

Jon Skeet
quelle
6
Ja, es ist Echtzeit.
Adam Gibbins
18
Nebenbemerkung: Wenn Ihre Distribution den Befehl tailf bereitstellt, verwenden Sie diesen anstelle von tail -f. tailf ist effizienter, weil es nicht auf die überwachte Datei zugreifen muss, wenn sie nicht geschrieben wird (Abstimmungszugriffe sind ärgerlich, wenn Sie das Dateisystem mit einer zeitweisen Aktualisierung gemountet haben.)
Mihai Limbăşan
10
Bei Super - User fand ich eine Antwort empfehle tail -F statt -f auch
Rafa
17
tail -Ffolgt Dateinamen anstelle von Dateiobjekten, was insbesondere bei der Rotation von Protokolldateien hilfreich ist.
Amir Ali Akbari
2
Update, einige Jahre später: tailfIst mittlerweile veraltet und tail -fsicher. (Bestätigen Sie dies auf Ihrem System mit man tailf.) Siehe Dokumentation: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer
124

Sie meinten wahrscheinlich Schwanz, wie Jon Skeet antwortete.

Ein weiterer nützlicher Punkt ist die Uhr . Hiermit können Sie einen Befehl in regelmäßigen Abständen ausführen und die Ausgabe im Vollbildmodus anzeigen. Zum Beispiel:

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

Führt den Befehl ls -l /var/adm/messagesalle 10 Sekunden aus und hebt den Unterschied in der Ausgabe zwischen den nachfolgenden Durchläufen hervor. (Nützlich, um beispielsweise zu beobachten, wie schnell eine Protokolldatei wächst.)

Murali Suriar
quelle
38

inotifywaitvon inotify-tools ist nützlich, wenn Sie einen Befehl jedes Mal ausführen möchten, wenn sich eine Datei (oder Dateien in einem Verzeichnis) ändert. Zum Beispiel:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done
richvdh
quelle
Nur eine Notiz, pathdie nicht die beste Wahl für einen Variablennamen ist. Bei zshUmgebungsvariablen wird anscheinend nicht zwischen Groß- und Kleinschreibung unterschieden. Für mich pathbewirkt das Setzen, dass PATHes auch gesetzt wird, und das bedeutet im Grunde, dass nichts ausgeführt wird, bis Sie das beheben. Ein bash, Einstellung pathhat keine Auswirkung auf PATH.
Thanatos
36

Ich bevorzuge die Verwendung von less +FG1 gegenüber der Verwendung von 1,tail -f da ich eine Protokolldatei nach einem bestimmten Fehler oder einer bestimmten ID durchsuchen muss. Wenn ich nach etwas suchen muss, gebe ich ein ^C, um die Datei nicht weiter ?zu verfolgen und rückwärts zu suchen.

Die Tastenbelegungen sind fast die gleichen wie in vi. Jeder Befehl kann beim Start mit der folgenden +Option initialisiert werden :

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

Bei sehr langen Protokollen ist es praktisch, die -nOption zu verwenden, mit der die Zeilennummerierung deaktiviert wird. Aus der 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. Hut ab vor rgmarcha, um in den Kommentaren darauf hinzuweisen.

Jon Ericson
quelle
Denken Sie daran, eine aliasmit den gewünschten Optionen festzulegen, damit Sie diese nicht jedes Mal eingeben müssen.
Michael Hampton
Eigentlich sollten Sie in den meisten Fällen Shell-Funktionen den Aliasnamen vorziehen.
Tripleee
21

Tail is great ... less kann auch verwendet werden, um weniger in der Datei zu starten, dh weniger myfile, dann drücken Sie Shift+ F. Dieser hat weniger Wirkung als Schwanz.

trent
quelle
5
less + F myfile schafft es auch
rgmarcha
16

Ich bearbeite eine LaTeX-Datei und wollte sie auch auf Änderungen irgendwo in der Mitte überwachen. Ich habe das folgende kleine Shell-Skript geschrieben, das sich für mich als nützlich erwiesen hat. Ich hoffe, es wird auch jemand anderem nützlich sein.

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

Speichern Sie es als watch.shund tun Sie es chmod u+x watch.sh. Dann führe ich es wie folgt aus:

./watch.sh file.tex pdflatex

Wenn Sie möchten, dass der Befehl nur ausgeführt wird, wenn tatsächlich Änderungen vorgenommen werden, können Sie `md5sum "$FILE"`statt verwenden `ls -l "$FILE"`.

oliphaunt
quelle
1
um Verzeichnisse und deren Inhalt anstelle einer einzigen Datei anzusehen:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy
8

Sie können den Befehl tailf verwenden, der am einfachsten ist

tailf logfile.log
reegan vijay
quelle
6

Sie können auch inotifywatch / inotifywait verwenden, das sich in das inotify-Subsystem des Kernels einhakt. Auf diese Weise können Sie auch nach Dingen wie "Öffnen", "Schließen" oder "Zugriff" Ausschau halten.

Aber wenn Sie einfach nur Zeilen an stdout anhängen möchten, stimme ich dem Schwanz zu.

Martin
quelle
3

Tail ist das übliche, traditionelle und überall verfügbare Unix-Tool. Ein etwas ausgefeilteres Tool ist Multitail, das mehrere Dateien gleichzeitig überwachen und die Syntax hervorheben kann.

hlovdal
quelle
3

Wenn ich in der Lage sein möchte, die Datei zu durchsuchen und sie nur zu verfolgen, verwende ich mit dem Befehl "F" weniger.

Beachten Sie bei der Verwendung von tail, dass zusätzliche Argumente erforderlich sind, wenn die Datei verschoben oder durch Bearbeiten ersetzt werden soll (Standardmodus für vim's: w).

tail -f bewirkt, dass tail den Dateideskriptor speichert und ihm folgt. Wenn die Datei ersetzt wird, wird der Deskriptor geändert. Der Vorteil des Verfolgens des Dateideskriptors besteht darin, dass Sie der Datei auch dann folgen, wenn sie umbenannt wird.

tail --follow = bewirkt, dass tail die benannte Datei nachverfolgt, indem es regelmäßig erneut geöffnet wird, um festzustellen, ob sie ersetzt wurde.

--retry ist eine weitere nützliche Option, wenn Sie eine Protokolldatei mit einem Tail versehen möchten, die Datei jedoch noch nicht erstellt wurde.

tail -F ist eine Abkürzung für --follow = --retry.

deinspanjer
quelle
2

Vergiss Schwanz, diff ist der Befehl, den du willst. Hier ist ein guter Trick, um die Unterschiede zu beobachten, die in Echtzeit (oder beim Schließen) zwischen zwei Dateien oder in einer Datei auftreten, in die geschrieben wird.

Mit diesen Methoden können Sie das Verhalten beliebig ändern, z. B. die Änderungen in eine Datei schreiben, um Aufzeichnungen zu führen. Spielen Sie mit dem Überwachungsintervall oder anderen Optionen für die folgenden Befehle.

Sie haben 1 Datei und möchten beobachten, wie Änderungen daran vorgenommen werden:

Also hier ist was zu tun:

  1. Kopieren Sie die Datei

cp file file2

  1. Schreiben Sie ein Bash-Skript, um die Unterschiede zu ermitteln, und aktualisieren Sie die Datei2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Hier ist eine Grundidee für das Drehbuch. Lassen Sie es in eine Datei schreiben, wenn Sie möchten

#!/bin/bash

diff file file2

cp file file2

  1. Als nächstes können Sie entweder die Unterschiede auf dem Bildschirm mit watch beobachten

watch ./check-differences

Dies wird standardmäßig alle 2 Sekunden aktualisiert. Wenn Sie also zurückgehen und sie lesen müssen, schreiben Sie die Ausgabe von diff in eine Datei im Skript.

oder verwenden Sie cron, um Ihr Skript regelmäßig auszuführen, wenn Sie keine Ausgabe sehen müssen.

Mezmer
quelle
1

Während tail -f somefile.txtich mit neuen Daten scrolle, bevorzuge ich manchmalless +G somefile.txt auch, einen Patch mit den neuesten Daten in der Datei anzusehen.

Phantomstrahl
quelle
4
Ich denke, das ist alles in dieser Antwort von vor 7 Jahren behandelt.
Kasperd