weniger mit "Update-Datei" wie Funktionalität

9

Ich möchte eine Datei sehen, die alle 5 Minuten mit überschrieben wird less. Wie kann ich lessden neuen Dateideskriptor befolgen, anstatt den alten anzuzeigen? watch "cat file"wird es nicht tun, weil die Datei zu lang ist, um in ein Terminalfenster zu passen.

d135-1r43
quelle
2
"Folgen" bedeutet, dem Ende der Datei zu folgen. Möglicherweise möchten Sie klarstellen, dass Ihre Datei überschrieben wird und Sie daran interessiert sind, sie erneut zu öffnen.
Chutz
Ich wollte dem Dateideskriptor folgen, wie er in tail -fder Manpage definiert ist. Trotzdem habe ich meine Frage geklärt.
d135-1r43
Verwenden Sie less --follow-namesiehe unix.stackexchange.com/a/74287/112522
djsutho

Antworten:

10

Sie können diesen Effekt erzielen, indem Sie den FBefehl ( Shift+F) eingeben, während Sie die Datei in anzeigen less. Drücken Sie, um die Verfolgung zu beenden und zum Paging zurückzukehrenCtrl+C

Da sich Ihre Datei nur alle 5 Minuten ändert, können Sie auch tail -feine längere Ruhezeit mit verwenden und angeben -s(standardmäßig 1 Sekunde). Zum Beispiel,

tail -f -s 60 myfile

prüft myfilealle 60 Sekunden auf Ausgabe.

EDIT: Aufgrund irreführender Fragen war die obige Antwort unbefriedigend. Der zweite Versuch folgt:

lessVersuchen Sie Folgendes, um dieselbe Datei alle 5 Minuten erneut zu öffnen :

while true; do ( sh -c 'sleep 600 && kill $PPID' & less myfile ); done

Dadurch wird eine Subshell erzeugt, die einen Hintergrund für einen anderen Shell-Prozess darstellt, der angewiesen wird, den übergeordneten Prozess nach 5 Minuten zu beenden. Dann öffnet es die Datei mit less. Wenn der Hintergrund-Shell-Befehl die übergeordnete Subshell beendet, werden alle untergeordneten Elemente beendet, einschließlich des Befehls "less". Dann startet die Schleife den Prozess erneut.

Die einzige einfache Möglichkeit, dies zu beenden, besteht darin, das Terminal zu töten, in dem sich Ihre ursprüngliche Shell befindet. Wenn dies nicht akzeptabel ist, können Sie den Trick "Killfile" verwenden:

touch killfile
while [ -f killfile]; do stuff; done

Um damit aufzuhören stuff, rmdas Killfile in einer anderen Shell.

Bonsaiviking
quelle
Dies ist für meinen Fall nur teilweise nützlich. Die beobachtete Datei ist sehr groß, die aktualisierten Informationen oben. Es ist keine "scrollende" Protokolldatei. Umschalt + F scrollt sofort zum Ende der Datei ...
d135-1r43
Sie sollten Ihre Frage bearbeiten, um dies zu klären. Ich habe meine Antwort bearbeitet, um auch dies zu beantworten.
Bonsaiviking
watch -n 1 less <filename>
Axel22
1

Sie können etwas Ähnliches in tun vim.

Starten Sie eine Serversitzung von vim:

vim -R --servername refresh_session

Überwachen Sie dann in einer anderen Konsole die Datei auf Aktualisierungen und weisen Sie die vim-Sitzung an, die Datei neu zu laden, sobald sie aktualisiert wird:

inotifywait -e close_write -m your_log_file | while read filename events; do
    vim --servername refresh_session --remote $filename
done

Ein paar Fallstricke.

  • Dies funktioniert natürlich nicht, wenn Sie vimnicht mit der clientserverFunktion in kompiliert sind .
  • inoifywaitfunktioniert nicht mehr, wenn die Datei gelöscht wird. Ich hoffe also, dass Ihre Datei überschrieben wird. Das kann man natürlich auch umgehen.

Und wenn Sie eine lessähnliche Erfahrung machen möchten , können Sie die lessMakros verwenden, um Ihre lessTastenkombinationen zu erhalten vim.

/usr/share/vim/vim73/macros/less.sh --servername refresh_session
Chutz
quelle
0

Ich fand ein altes, aber sehr gutes "weniger" ähnliches Programm (einen "Pager"). Es hat einen "R" -Befehl, der die Datei aktualisiert.

Es heißt "lv" . Sie können es unter Ubuntu installieren mit:

sudo apt install lv

Es scheint jedoch keine Autoreload-Funktion zu haben.

Ronie
quelle
-1

Sie können diesen Befehl versuchen: tail -f file

FINESEC
quelle
-1

Schwanz ist dein Freund. "tail -f Dateiname" zeigt Ihnen neue Zeilen, wenn sie erscheinen.

Oder wenn Sie nach Änderungen suchen, die in der Mitte der Datei vorgenommen wurden, führen Sie möglicherweise alle paar Minuten ein Skript aus, um eine Kopie der Datei an einen temporären Speicherort zu erstellen und einen Unterschied zu machen?

David W.
quelle
Schon im ursprünglichen Beitrag war klar, dass es eine "neue Datei" gab. Daher hätte sich der Dateideskriptor geändert, tail -fwürde aber immer noch den alten lesen.
Alastair Irvine
Ich finde das nicht sehr fair. Um kristallklar zu sein, müssen wir uns den ursprünglichen, unbearbeiteten Beitrag ansehen, denn wenn Sie sich das Datum meiner Antwort ansehen, ist dies die Frage, die ich beantwortet habe. In dieser unbearbeiteten Frage macht meine Antwort vollkommen Sinn. serverfault.com/posts/445899/revisions
David W
Ich habe die Revisionen überprüft. Schlüsselwörter "neue Datei".
Alastair Irvine