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.
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.)
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.)
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
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.
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.
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"`.
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.
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.
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.
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:
Kopieren Sie die Datei
cp file file2
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
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
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.
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.
tail -F
folgt Dateinamen anstelle von Dateiobjekten, was insbesondere bei der Rotation von Protokolldateien hilfreich ist.tailf
Ist mittlerweile veraltet undtail -f
sicher. (Bestätigen Sie dies auf Ihrem System mitman tailf
.) Siehe Dokumentation: man7.org/linux/man-pages/man1/tailf.1.htmlSie 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:
Führt den Befehl
ls -l /var/adm/messages
alle 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.)quelle
inotifywait
von 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:quelle
path
die nicht die beste Wahl für einen Variablennamen ist. Beizsh
Umgebungsvariablen wird anscheinend nicht zwischen Groß- und Kleinschreibung unterschieden. Für michpath
bewirkt das Setzen, dassPATH
es auch gesetzt wird, und das bedeutet im Grunde, dass nichts ausgeführt wird, bis Sie das beheben. Einbash
, Einstellungpath
hat keine Auswirkung aufPATH
.Ich bevorzuge die Verwendung von
less +FG
1 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 :Bei sehr langen Protokollen ist es praktisch, die
-n
Option zu verwenden, mit der die Zeilennummerierung deaktiviert wird. Aus der Manpage:1. Hut ab vor rgmarcha, um in den Kommentaren darauf hinzuweisen.
quelle
alias
mit den gewünschten Optionen festzulegen, damit Sie diese nicht jedes Mal eingeben müssen.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.
quelle
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.
Speichern Sie es als
watch.sh
und tun Sie eschmod 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"`
.quelle
NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Sie können den Befehl tailf verwenden, der am einfachsten ist
quelle
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.
quelle
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.
quelle
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.
quelle
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:
cp file file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
#!/bin/bash
diff file file2
cp file file2
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.
quelle
Während
tail -f somefile.txt
ich mit neuen Daten scrolle, bevorzuge ich manchmalless +G somefile.txt
auch, einen Patch mit den neuesten Daten in der Datei anzusehen.quelle