Der Linux-Tail-Befehl gehört zu den es­sen­zi­el­len Werk­zeu­gen auf der Kom­man­do­zei­le. In erster Linie dient der Befehl dazu, das Ende einer (Text)-Datei aus­zu­ge­ben, bzw. die Ausgabe eines Linux-Befehls auf einen gegebenen Umfang zu be­schrän­ken. Damit steht der Linux-Tail-Befehl in einer Reihe mit dem Linux-Head-Befehl und den Befehlen 'cat' und 'less'. Die genannten Linux-Befehle werden allesamt ein­ge­setzt, um die Inhalte von Text­da­tei­en aus­zu­ge­ben.

Der Linux-Tail-Befehl ist Teil der GNU Core Utilities (Coreutils). Es handelt sich dabei um eine Sammlung grund­le­gen­der Befehle für die Kom­man­do­zei­le, welche im Open Source Be­triebs­sys­tem Linux enthalten sind. Die Coreutils sind unter einer Open Source Lizenz ver­öf­fent­licht und stehen für eine Vielzahl un­ter­schied­li­cher Be­triebs­sys­te­me zum Download bereit.

Mo­ti­va­ti­on des Linux-Tail-Befehls

Die Grund­le­gen­de Funk­tio­na­li­tät des Linux-Tail-Befehls besteht darin, das Ende einer Datei aus­zu­ge­ben. Dazu sollten Sie wissen, dass Daten, die in eine Datei ge­schrie­ben werden, am Ende der Datei landen. Der Linux-Tail-Befehl erlaubt uns also, zu über­prü­fen, ob einer Datei neue Daten angehängt wurden. Daher ist der Linux-Tail-Befehl beliebt, um Log­da­tei­en aus­zu­wer­ten und zu über­wa­chen.

Viele Programme, ins­be­son­de­re Webserver wie Apache oder nginx schreiben Status-In­for­ma­tio­nen in so­ge­nann­te Log­da­tei­en. Im Falle von Server-Logs enhalten die Dateien pro Zeile u. A. einen Zeit­stem­pel, die URL der ab­ge­frag­ten Resource und die IP-Adresse der an­fra­gen­den Partei.

Die Log­da­tei­en wachsen mit jeder einzelnen Anfrage und werden dabei immer größer. Um die Größe ab einem be­stimm­ten Punkt zu begrenzen, werden Logdatien für ge­wöhn­lich „rotiert“. Die Logdatei wird dabei kom­pri­miert und unter einem neuen Namen ar­chi­viert. Ferner wird eine neue, leere Logdatei unter dem ur­srpüng­li­chen Namen angelegt. Hier eine Übersicht ge­bräuch­li­cher Log­da­tei­en unter Ubuntu-Linux:

Unbuntu-Linux Logdatei Erklärung
/var/log/auth.log Linux Aut­ho­ri­sie­rungs-Log
/var/log/daemon.log Linux Daemon-Log
/var/log/debug Linux Debug-Log
/var/log/kern.log Linux Kernel-Log
/var/log/syslog Linux System-Log
/var/log/apache2/access.log Zugriffe auf Web­in­hal­te des Apache2-Web­ser­vers
/var/log/apache2/error.log Feh­ler­mel­dun­gen des Apache2-Web­ser­vers

Aufruf des Linux-Tail-Befehls auf der Kom­man­do­zei­le

Der Aufruf des Linux-Tail-Befehls erfolgt auf der Kom­man­do­zei­le. Wie üblich wird der Name des Befehls gefolgt von op­tio­na­len Pa­ra­me­tern ein­ge­ge­ben. Ab­ge­schlos­sen wird der Aufruf vom Namen bzw. Pfad einer oder mehrerer Dateien. Schauen wir uns zunächst die Schreib­wei­se des ge­ne­rel­len Falls an:

tail [optionen] <dateien>

Ohne Optionen ergibt sich als sim­pels­ter Aufruf des Linux-Tail-Befehls das folgende Muster:

tail <datei>

So auf­ge­ru­fen, gibt der Linux-Tail-Befehl die letzten zehn Zeilen der an­ge­ge­be­nen Datei aus. Dies ist nützlich, um die zuletzt in die Datei ge­schrie­be­nen Daten anzusehen.

Grund­le­gen­de Optionen des Linux-Tail-Befehls

Der Linux-Tail-Befehl lässt sich über Parameter steuern. Als Teil der GNU Coreutils gibt es für jede Option eine Langform. Für die am häu­figs­ten genutzten Optionen gibt es ferner eine oft his­to­risch bedingte Kurzform. Wir zeigen hier eine Übersicht der nütz­lichs­ten Optionen:

Option (Kurzform / Langform) Erklärung
-n / --lines Ausgabe auf die letzten n Zeilen begrenzen / Ausgabe auf die ab Zeile n folgenden Zeilen be­schrän­ken
-c / --bytes Ausgabe auf die letzten n Bytes begrenzen / Ausgabe auf die ab Byte n folgenden Bytes be­schrän­ken
-q / --quiet, --silent Bei Nutzung mit mehreren Dateien Ausgabe der Da­tei­na­men un­ter­drü­cken
-v / --verbose Bei Nutzung mit mehreren Dateien Ausgabe der Da­tei­na­men erzwingen
--help Hilfs­in­for­ma­tio­nen des Befehls ausgeben
--version Ver­si­ons­in­for­ma­tio­nen des Befehls ausgeben
Hinweis

Der Linux-Tail-Befehl ist primär für die Nutzung mit Text­da­tei­en im ASCII|-Zei­chen­satz kon­zi­piert. Für diese gilt, dass ein Zeichen genau einem Byte ent­spricht. Wenn Sie Dateien im Unicode-Zei­chen­satz mit der '-c'-Option des Linux-Tail-Befehls ver­ar­bei­ten, kann es ggf. zu un­er­war­te­ten Ne­ben­ef­fek­ten kommen.

Wei­ter­ge­hen­de Optionen des Linux-Tail-Befehls

Die bereits gezeigten grund­le­gen­den Optionen des Linux-Tail-Befehls sind in ihrer Funk­ti­ons­wei­se analog zu denen des Head-Befehls. Während der Head-Befehl jedoch den Anfang einer Datei ausgibt, liefert der Linux-Tail-Befehl das Ende einer Datei. Der Befehl kann aber noch einiges mehr.

Ins­be­son­de­re bietet der Linux-Tail-Befehl eine Vielzahl von Optionen, um Dateien auf Än­de­run­gen zu über­wa­chen. Mit dem Linux-Tail-Befehl lassen sich am Ende der Datei hin­zu­ge­kom­men Daten kon­ti­nu­ier­lich ausgeben. Daher ist das Kommando besonders geeignet, um Log­da­tei­en zu über­wa­chen. Dieser Prozess ist auch als „Live-Tail“ bekannt. Hier eine Übersicht der dabei am häu­figs­ten zum Einsatz kommenden Optionen:

Option (Kurzform / Langform) Erklärung
-f / --follow=[{name|de­scrip­tor}] Datei auf Än­de­run­gen über­wa­chen und neu an das Ende der Datei ge­schrie­be­ne Daten kon­ti­nu­ier­lich ausgeben. Ohne Angabe eines Wertes nach '--follow=' wird 'de­scrip­tor' als Default-Wert verwendet. Damit läuft der Live-Tail auch weiter, wenn die Datei umbenannt oder ver­scho­ben wird.
-F Ent­spricht Aufruf mit --follow=name --retry; der Effekt ist, dass der Live-Tail auch dann wei­ter­läuft, wenn die ur­sprüng­li­che Datei im Zuge der Lo­gro­ta­ti­on entfernt und durch eine neue Datei mit gleichem Namen ersetzt wird.
-s / --sleep-interval=N Ausgabe der Datei für die an­ge­ge­be­ne Anzahl Sekunden ruhen gelassen.
--retry Versuchen, eine nicht ver­füg­ba­re Datei erneut zu öffnen, sobald sie wieder verfügbar wird. Ist ins­be­son­de­re in Kom­bi­na­ti­on mit der Option '--follow=name' sinnvoll, um nach Rotation einer Logdatei die neue Datei gleichen Namens weiterhin zu über­wa­chen.
--pid=PID Mit der Option -f genutzt, wird der Tail-Befehl beendet, wenn der Prozess mit der an­ge­ge­be­nen Prozess-ID ter­mi­niert. Nützlich, um den Live-Tail ab­zu­bre­chen, wenn das in die Datei schrei­ben­de Programm beendet wird.

Beispiele für den Einsatz des Linux-Tail-Befehls

In der Do­ku­men­ta­ti­on der Coreutils ist der Linux-Tail-Befehl im Abschnitt „Output of parts of files“ („Teile von Dateien ausgeben“) auf­ge­führt. Dabei sollten Sie wissen, dass der Begriff „Dateien“ hierbei weit gefasst ist. Präziser ist der Begriff „Text­strö­me”.

Der Unix-Phi­lo­so­phie folgend nutzen Kom­man­do­zei­len-Befehle Text­strö­me als uni­ver­sel­les Ein- und Aus­ga­be­for­mat. Bei Text­strö­men handelt es sich ins­be­son­de­re um Dateien, jedoch auch um die Stan­dard­ein­ga­be und -ausgabe der Kom­man­do­zei­le. Ferner sind die so­ge­nann­ten „Pipes”, zu Deutsch in etwa „Rohr­lei­tun­gen”, von großer Wich­tig­keit. Diese erlauben das Verketten mehrerer Befehle. Dabei wird die Ausgabe eines Befehls als Eingabe an den nächsten Befehl wei­ter­ge­reicht.

Die zu­grun­de­lie­gen­de Idee, mehrere Befehle mit­ein­an­der zu verketten, geht wiederum auf die Unix-Phi­lo­so­phie zurück. Anstatt komplexe Befehle für gänzlich ver­schie­de­ne Aufgaben zu ent­wi­ckeln, gibt es eine relativ über­schau­ba­re Menge ge­ne­rel­ler Befehle. Der Maxim „do one thing, and do it well“ („mach nur eine Sache, aber mache sie gut“) folgend, verfügt ein jeder Befehl über eine eng umrissene Funk­tio­na­li­tät. Die Befehle nutzen Text­strö­me als uni­ver­sel­le Schnitt­stel­le und lassen sich zu immer wieder neuen Lö­sungs­an­sät­zen kom­bi­nie­ren.

Hinweis

In den nach­fol­gen­den Bei­spie­len nutzen wir beim Aufruf des Linux-Tail-Befehls die Optionen in der Kurzform ('-n', statt '--lines', etc.) Wenn Sie andere Do­ku­men­ta­tio­nen oder Code-Beispiele lesen, werden Sie häufige auf diese Ver­wen­dung stoßen.

Generelle Beispiele für den Einsatz des Linux-Tail-Befehls

Die nach­fol­gen­den ge­ne­rel­len Beispiele greifen auf die eingangs dar­ge­stell­ten grund­le­gen­den Optionen des Linux-Tail-Befehls zurück. Für Beispiele, welche die wei­ter­füh­ren­den Optionen nutzen, lesen Sie den Abschnitt über die Über­wa­chung von Log­da­tei­en weiter unten.

Die meisten dar­ge­stell­ten Beispiele kom­bi­nie­ren den Linux-Tail-Befehl mit einem oder mehreren weiteren Linux-Befehlen. Dabei kommen die erwähnten Pipes zum Einsatz, um die Ausgabe eines Befehls als Eingabe des nächsten Befehls zu nutzen.

Mit dem Linux-Tail-Befehl das Ende einer Datei ausgeben

Im ein­fachs­ten Falle nutzen wir den Linux-Tail-Befehl, um die letzten Zeilen einer Datei aus­zu­ge­ben. Um dies aus­zu­pro­bie­ren, ersetzen Sie den Platz­hal­ter '<datei>' durch den Namen bzw. Pfad einer auf Ihrem System exis­tie­ren­den Textdatei. Hier nutzen wir die -n-Option und geben die letzten drei Zeilen einer Datei aus:

tail -n 3 <datei>

Oft ist es nützlich, den Kontext der mit dem Linux-Tail-Befehl ver­ar­bei­te­ten Datei im Auge zu behalten. Um die Zeilen mit Zei­len­num­mern versehen aus­zu­ge­ben, ver­ar­bei­ten wir die Datei zunächst mit dem nl-Befehl (der Name stammt von „line numbering“— „Zei­len­num­me­rie­rung“) und leiten die Ausgabe per Pipe an den Linux-Tail-Befehl weiter:

nl <datei> | tail -n 3

Zuletzt benutzte Befehle auf der Kom­man­do­zei­le ausgeben

Der History-Befehl zeigt auf der Kom­man­do­zei­le ein­ge­ge­be­ne Befehle an. Oft in­ter­es­siert man sich nur für die letzten Aufrufe. Ferner kann eine komplette Ausgabe der Befehls-History u. U. sensible Daten enthüllen. Hier leiten wir die Ausgabe des History-Befehls an den Linux-Tail-Befehl weiter und geben die letzten fünf Zeilen aus:

history | tail -n 5

Mit dem Linux-Tail-Befehl die ältesten Backup-Dateien in einem Ver­zeich­nis löschen

Schauen wir uns ein kom­ple­xe­res Beispiel an. Wir werden aus einem Ver­zeich­nis mit Backup-Dateien die zehn ältesten Dateien löschen. Um dies zu be­werk­stel­li­gen, nutzen wir die vier Linux-Befehle 'ls', 'tail', 'xargs' und 'rm':

ls -t *.bak | tail | xargs rm

Was genau geschieht hier?

  1. Der ls-Befehl listet die Dateien eines Ver­zeich­nis­ses auf.

Mit der '-t'-Option versehen, werden die Dateien nach Än­de­rungs­da­tum sortiert. Dabei stehen die ältesten Dateien ganz unten in der Liste.

Wir nutzen für die Da­ten­quel­le das Such­mus­ter '*.bak'. Dabei handelt es sich um eine ge­bräuch­li­che Datei-Endung für Backup-Dateien. Ferner dient dies zum Schutz, damit Sie beim Aufruf nicht aus Versehen wichtige Dateien löschen.

Per Pipe leiten wir die Da­tei­lis­te an den Linux-Tail-Befehl weiter.

  1. Mit dem Linux-Tail-Befehl ohne Angabe von Optionen lesen wir die letzten zehn Dateien aus der Liste aus. Bei den aus­ge­ge­be­nen Da­tei­na­men handelt es sich um die ältesten Dateien im Ver­zeich­nis.
  2. Der xargs-Befehl nimmt eine Liste von Dateien und den Namen eines Befehls entgegen. Der Befehl wird aus­ge­führt, wobei die Dateien als Argumente übergeben werden.

In unserem Beispiel gibt der Linux-Tail-Befehl einen Text mit mehreren Zeilen zurück. Jede Zeile enthält den Namen einer zu löschen Datei. Per 'xargs' werden die Da­tei­na­men aus den Zeilen gelöst und als Argumente dem rm-Befehl übergeben.

  1. Zum Löschen von Dateien unter Linux greifen wir auf den rm-Befehl zurück. Dieser löscht die als Argumente über­ge­be­nen Dateien.

Beachten Sie, dass die Dateien nicht in den Pa­pier­korb ver­scho­ben, sondern sofort gelöscht werden.

Beim Löschen von Dateien auf der Linux-Kom­man­do­zei­le ist Vorsicht geboten. Damit Sie unser Beispiel ohne Sorge aus­pro­bie­ren können, sollten Sie zunächst ein Ver­zeich­nis mit Test-Dateien anlegen. Führen Sie dafür den folgenden Code auf der Kom­man­do­zei­le aus:

mkdir ~/Desktop/tail-test/
cd ~/Desktop/tail-test/
touch test-{1..100}.bak

Zunächst legen wir ein Test-Ver­zeich­nis 'tail-test/' auf dem Desktop an und wechseln in das Ver­zeich­nis. An­schlie­ßend erzeugen wir 100 leere Test-Dateien mit den 'test-1.bak' bis 'test-100.bak'. Führen Sie danach den Code zum Löschen der zehn ältesten Dateien aus:

ls -t ~/Desktop/tail-test/*.bak | tail | xargs rm

Mit dem Linux-Tail-Befehl Server-Log­da­tei­en auf Än­de­run­gen über­wa­chen

Bisher haben wir die generelle Funk­ti­ons­wei­se des Linux-Tail-Befehls be­trach­tet. In den folgenden Bei­spie­len legen wir den Fokus auf die Live-Über­wa­chung von Server-Log­da­tei­en („Live-Tail“).

In diesen Bei­spie­len gehen wir vom Apache2-Webserver unter Ubuntu-Linux aus. Dort liegen die Log­da­tei­en im Ver­zeich­nis '/var/log/apache2/'. Auf anderen Linux-Dis­tri­bu­tio­nen ist der Spei­cher­ort ggf. ein anderer. Gleiches gilt bei anderen Web­ser­vern, wie etwa nginx.

Hinweis

Eventuell hat nur der Root-Benutzer Zugriff auf das Ver­zeich­nis mit Log­da­tei­en. In diesem Fall müssten Sie die Befehle mit 'sudo' ausführen.

Mit dem Linux-Tail-Befehl eine Server-Logdatei auf Än­de­run­gen über­wa­chen

Ein normaler Aufruf des Linux-Tail-Befehls gibt einmalig die an­ge­ge­be­ne Anzahl Zeilen einer Datei aus. Werden danach neue Daten am Ender Datei angehängt, muss der Befehl erneut aus­ge­führt werden. Genau für diesen Fall gibt es wei­ter­füh­ren­de Optionen. Diese weisen das Kommando an, eine Datei auf Än­de­run­gen zu über­wa­chen und diese kon­ti­nu­ier­lich aus­zu­ge­ben.

Schauen wir uns an, wie das am Beispiel des Zugriffs-Logs des Apache2-Webserver funk­tio­niert. Wir rufen den Linux-Tail-Befehl mit der -f-Option auf und übergeben den Namen der Logdatei:

tail -f /var/log/apache2/access.log

So auf­ge­ru­fen, werden Än­de­run­gen am Zugriffs-Log kon­ti­nu­ier­lich aus­ge­ge­ben. Dieser Ansatz ist bei vielen Zugriffen pro Zeit­ein­heit nicht prak­ti­ka­bel. In diesem Falle ändert sich das Log so schnell, dass das Terminal mit Daten über­flu­tet wird. Drücken Sie die Tas­ten­kom­bi­na­ti­on 'Strg+C', um die laufende Aus­füh­rung des Live-Tails ab­zu­bre­chen.

Mit der Option '-f' auf­ge­ru­fen, überwacht der Linux-Tail-Befehl die an­ge­ge­be­ne Datei. Wird diese entfernt, bricht die Ausgabe ab. Wie eingangs erklärt, werden Log­da­tei­en pe­ri­odisch rotiert. Es wird also eine neue Datei unter dem alten Namen angelegt. Um die Über­wa­chung einer Log-Datei trotz Rotation fort­zu­set­zen, nutzen wir die -F-Option:

tail -F /var/log/apache2/access.log

Mit dem Linux-Tail-Befehl mehrere Server-Log­da­tei­en auf Än­de­run­gen über­wa­chen

Bisher haben wir mit dem Linux-Tail-Befehl eine einzelne Datei ver­ar­bei­tet. Der Befehl erlaubt jedoch auch die Über­wa­chung mehrerer Dateien gleich­zei­tig. Hier nutzen wir das Such­mus­ter '*.log', um alle Dateien mit der Endung '.log' kon­ti­nu­ier­lich zu über­wa­chen:

tail -F /var/log/apache2/*.log

Für die Ver­ar­bei­tung mehrerer Dateien gibt es zwei weitere Optionen. Zum einen können wir mit der '-q'-Option die Ausgabe der Da­tei­na­men un­ter­drü­cken:

tail -q -F /var/log/apache2/*.log

Analog dazu lässt sich mit der -v-Option die Ausgabe der Da­tei­na­men erzwingen. Dies macht Sinn, falls das Such­mus­ter nur eine einzelne Datei zu­rück­lie­fert:

tail -v -F /var/log/apache2/*.log

Mit dem Linux-Tail-Befehl eine Server-Logdatei auf spe­zi­fi­sche Än­de­run­gen über­wa­chen

In den bis­he­ri­gen Bei­spie­len haben wir eine Logdatei auf jedwede Änderung hin überwacht. Ge­bräuch­li­cher ist jedoch die Ein­schrän­kung auf bestimmte Än­de­run­gen. Um die Ausgabe der Än­de­run­gen einer Logdatei auf ein Such­mus­ter zu begrenzen, nutzen wir den grep-Befehl. Hier ein ge­ne­rel­les Beispiel für diesen Ansatz:

tail -F /var/log/apache2/access.log | grep <muster>

Konkret ist es oft sinnvoll, einen Server-Log auf den Zugriff durch eine bestimmte IP-Adresse zu über­wa­chen. Dies kann bei­spiels­wei­se nützlich sein, um fest­zu­stel­len, ob ein Angriff auf einen Server bereits ab­ge­schlos­sen ist oder noch läuft. Hier über­wa­chen wir das Zugriffs-Log des Apache-Webserver auf von der IP-Adresse '93.184.216.34' stammende Anfragen:

tail -F /var/log/apache2/access.log | grep '93.184.216.34'
Hinweis

Wir benutzen hier die IP-Adresse der Beispiel-Domain 'example.com'. Sollte ein Zugriffs-Log diese tat­säch­lich enthalten, handelt es sich mit hoher Wahr­schein­lich­keit um eine gespoofte IP-Adresse.

Schauen wir uns ein weiteres ge­läu­fi­ges Einsatz-Szenario an. Anstatt das Zugriffs-Log nach IP-Adresse zu filtern, über­wa­chen wir Zugriffe auf eine bestimmte Ressource. Ein Zugriff auf die Datei 'robots.txt' weist auf Anfragen von Such­ma­schi­nen-Bots hin. Wiederum machen wir uns den Grep-Befehl zunutze. So auf­ge­ru­fen werden nur neu hin­zu­kom­men­de Zugriffe von Such­ma­schi­nen-Bots aus­ge­ge­ben:

tail -F /var/log/apache2/access.log | grep 'robots.txt'
Zum Hauptmenü