`tail -f` wird manchmal nicht mehr aktualisiert - und die Datei wurde nicht verschoben

10

Ich habe kürzlich festgestellt, dass tail -f <logfile>die Aktualisierung des Bildschirms manchmal unterbrochen wird.

Ein Ctrl>- Cund ein Neustart tailfunktioniert jedoch einwandfrei. Und ich habe überprüft, ob die Protokolldatei nicht in der Mitte des Streams gedreht wird (was dazu führen kann, dass tailsie den Verstand verliert).

Was würde das verursachen? Ich verwende RHEL 5.2 x64.

Labyrinth
quelle
Kommt dies bei allen Protokolldateien vor oder nur bei bestimmten? Auf welchem ​​Dateisystem befindet sich die Protokolldatei? Welche Anwendung schreibt die Protokolldatei? Haben Sie den Fehler zeitlich festgelegt, um festzustellen, ob er entweder (1) einen bestimmten Zeitraum nach dem Starten des Befehls tail auftritt? oder (2) in bestimmten festen Intervallen (z. B. immer um: 00: 10: 20: 30: 40 und: 50 nach der vollen Stunde)?
Daveadams
@daveadams - Soweit ich bemerkt habe, war es nur auf zwei (einer auf jedem von zwei Servern): in diesem Fall die Dataminer-Protokolldatei für BSAE (Reporting Tool) auf einem HPSA Core-Server (Rechenzentrumsautomatisierung) und die server.log für BSAE auf dem berichtenden Host
Warren
1
Abgesehen davon funktioniert tail -F auch dann weiter, wenn die Datei entfernt und später vollständig durch eine andere Datei ersetzt wird.
Sirex

Antworten:

6

Versuchen Sie, Ihren Schwanzbefehl mit stracefolgenden Zeichen zu versehen:

strace -Tt -o /tmp/tail.trace tail -f /var/log/messages

Dann können Sie nur für verrückte rekursive Kicks die Strace-Ausgabe verfolgen (spielt keine Rolle, wenn das kaputt geht, weil es in eine Datei geht):

 tail -f /tmp/tail.trace

Meins sieht aus wie:

8:39:00 write(1, "ng SMAC\n", 8)       = 8 <0.000026>
18:39:00 read(3, "", 0)                 = 0 <0.000019>
18:39:00 fstat64(3, {st_mode=S_IFREG|0640, st_size=92990, ...}) = 0 <0.000019>
18:39:00 fstatfs64(3, 84, {f_type="EXT2_SUPER_MAGIC", f_bsize=4096, f_blocks=4807069, f_bfree=1924458, f_bavail=1680271, f_files=1221600, f_ffree=820806, f_fsid={-1331083162, -1313908385}, f_namelen=255, f_frsize=4096}) = 0 <0.000021>
18:39:00 inotify_init()                 = 4 <0.000033>
18:39:00 inotify_add_watch(4, "/var/log/messages", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1 <0.000041>
18:39:00 fstat64(3, {st_mode=S_IFREG|0640, st_size=92990, ...}) = 0 <0.000019>
18:39:00 read(4,

Das -t schaltet die Zeit ein und -T schaltet die in Anrufen verbrachte Zeit ein.

Drücken Sie 4 oder 5 Mal die Eingabetaste, um ein wenig vertikalen Raum zu schaffen, und warten Sie dann, bis das Tailing aufhört. Hoffentlich gibt es einige Hinweise in der Ausgabe.

Davey
quelle
9

Versuchen Sie es mit:

tail --follow=name <logfile>

Und sehen Sie, ob das besser funktioniert. Sie müssen sich keine Sorgen machen, dass es unter Ihnen herausgedreht wird.


Gibt es ein Muster dafür? Bestimmte Zeitdauer? Bestimmte Tageszeit?

MikeyB
quelle
Die Datei wird nicht von unten herausgedreht tail- es wird nur in regelmäßigen Abständen (irgendwann zwischen 2 und 20 Stunden) angehalten, um zu folgen. Ich wünschte, es gäbe mehr Muster: - \
warren
Wenn Sie andere Tasten auf der Tastatur drücken (außer Strg-C), wird es besser? Wenn es stoppt, können Sie versuchen, es mit strace / ltrace / etc. Anzubringen. um zu sehen, ob es etwas tut.
MikeyB
gute gedanken auf der strace - weder eintreten noch andere schlüssel lassen etwas passieren; Ich mag es manchmal, ein Tail-F in einer screenSitzung zum erweiterten Debuggen laufen zu lassen , und das ist besorgniserregend
Warren
1
Ah ... möglicherweise nicht Ihr Problem, aber stellen Sie sicher, dass Sie nicht versehentlich ein Bildschirmfenster im Kopiermodus geöffnet lassen, während tail -f ausgeführt wird. Im Kopiermodus wird der Befehlsausgabeblock eventuell blockiert (wenn der Puffer voll ist).
MikeyB
Hervorragende Antwort. Natürlich wurden meine Dateien zu jeder vollen Stunde herausgedreht!
Alex
4

Angesichts der Tatsache, dass beide problematischen Protokolldateien von verschiedenen Komponenten derselben Anwendung geschrieben werden, frage ich mich, ob nicht ein Teil des Protokollierungscodes für diese Anwendung das Problem verursacht. Ich schlage zwei Tests vor, um eine bessere Vorstellung davon zu bekommen, was los ist:

  • Notieren Sie sich den Inode der logfile ( ls -i logfile), bevor Sie den Schwanz starten. Wenn der Schwanz ausfällt, überprüfen Sie ihn erneut. Wenn sich der Inode geändert hat, schreibt der Logger die gesamte Protokolldatei neu, wodurch die Verbindung zum Tail unterbrochen wird.

  • Beachten Sie die letzte Zeile, bevor der Schwanz nicht mehr funktioniert. Besuchen Sie dann die Datei und suchen Sie den ersten Protokolleintrag nach dieser Zeile. Tun Sie dies nach Möglichkeit 3-5 Mal. Wenn es ein Problem mit dem Programm gibt, das die Protokollierung durchführt, ist höchstwahrscheinlich der Teil des Programms verantwortlich, der den Protokolleintrag unmittelbar nach dem Auftreten von Tail Break geschrieben hat. Wenn dieser Protokolleintrag immer derselbe ist oder von derselben Programmkomponente stammt, verfügen Sie möglicherweise über genügend Daten, um einen Problembericht an den Anwendungsanbieter zu senden.

Viel Glück.

Daveadams
quelle
3

Das gleiche Problem hier haben.

Das Problem war, dass die Datei, die ich gerade beobachte, von einem anderen Computer gemountet wurde. Die Änderungsbenachrichtigung wurde nicht über das Mount weitergegeben.

Die Lösung bestand darin, den Schwanz auf der Originalmaschine zu verwenden.

Stephan Hoyer
quelle