Lsof findet, zeigt und untersucht Datenströme

Aus LinuxUser 04/2016

Lsof findet, zeigt und untersucht Datenströme

© Jovanche Vitanovski, 123RF

Offene Türen

Unter Unix und Linux gilt: Alles ist eine Datei. Daher sind Tools, die Informationen über Dateien und Datenströme liefern, von großer Bedeutung. Zu den wichtigsten dieser Werkzeuge zählt Lsof.

Die Idee von Lsof [1] ist recht einfach: Das Programm ermittelt spezielle Systemressourcen – reguläre Dateien, Verzeichnisse, Block- und Zeichengeräte, Streams oder Netzwerkfiles (Sockets) – die vom Kernel geöffnet wurden. Dann gibt es eine Liste dieser Ressourcen aus, angereichert mit zusätzlichen Informationen wie beispielsweise der PID, UID, dem Status und so weiter. Daneben verrät Ihnen Lsof die Pfade von geöffneten Dateien. Auf diese Weise lässt sich herausfinden, welche Bibliotheken und Konfigurationsdateien ein Programm momentan verwendet.

Solche Informationen helfen dabei, Fehler im Ablauf der Prozesse beziehungsweise im System zu finden und zu beheben. Tritt etwa beim Aushängen einer angesteckten USB-Festplatte ein Problem auf, zeigt Ihnen Lsof den blockierenden Prozess, der momentan noch auf die Ressource zugreift. Beenden Sie ihn, dann lässt sich die Festplatte ordnungsgemäß entfernen. Problematischer wird es, wenn Prozesse nicht mehr auf Signale reagieren oder abgestürzt sind. In diesen Fällen lassen sie sich zwar oft noch mit Lsof ermitteln, aber nicht mehr durch Kill beenden.

Tatsächlich ist Lsof aber weit mehr als ein einfaches Werkzeug zum Auffinden offener Files beziehungsweise der intern verwendeten File-Deskriptoren. Es verfügt über Features, wie sie sonst nur Ps, Netstat und eine Reihe weiterer Tools bieten. Gerade die Funktionsvielfalt macht die Arbeit mit Lsof allerdings nicht gerade einfach. Wie bei Befehlszeilenprogrammen üblich aktivieren respektive deaktivieren Sie die speziellen Features von Lsof über Optionen (siehe Tabelle “Wichtige Optionen von Lsof”). Da Lsof sehr viele Optionen kennt, lohnt ein Blick auf die Syntax der Optionen.

Wichtige Optionen von Lsof

Option Funktion
-a logisches Und
-b verhindert, dass Lsof blockierende Funktionen verwendet
-c Zeichen wählt nur Prozesse aus, die mit Zeichen beginnen
+c Anzahl definiert, wie viele Zeichen berücksichtigt werden
+d Verzeichnis alles finden, was auf das Verzeichnis und dort enthaltene Dateien zeigt
-d Muster alles ausschließen, was dem angegebenen Muster entspricht
+D Verzeichnis wie +d, berücksichtigt Unterverzeichnisse
+/-f definiert, wie Lsof Pfade interpretieren soll
-i4 / -i6 nur IPv4- beziehungsweise IPv6-Verbindungen berücksichtigen
-p PID nur Prozesse mit der angegebenen PID berücksichtigen
-t nur PIDs ausgeben, sodass die Ausgabe als Argument für Kill dienen kann
-u User nur Prozesse des angegebenen Users (UID oder Name) berücksichtigen
-U Unix Domain Sockets verwenden
-T Key TCP/IP-Informationen gemäß Key ausgeben (siehe Manpage)
-s Dateigrößen anzeigen
-S Sekunden Timeout für Kernel-Funktionen (min. 2s, Vorgabe 15s)
+/-r Sekunden aktiviert den Wiederholungsmodus
-V markiert angeforderte, aber nicht gefundene Befehle, Dateien, IDs, etc.

Syntax

Als Kennzeichen für Optionen (Prefix) nutzt Lsof sowohl das normalerweise verwendete Minuszeichen (-Option), als auch das Pluszeichen (+Option). Minuszeichen leiten Optionen ein und aktivieren sie, wobei Sie mehrere Schalter kombinieren dürfen: -a -b lässt sich auch als -ab angeben, genauso gut funktioniert auch -ac Anzahl für -a +c Anzahl.

Das Pluszeichen bleibt etwas spezielleren Optionen vorbehalten. Bei den Optionen spielt es eine wichtig Rolle, ob Sie sie mit einem Prefix in Form eines Plus- oder Minuszeichens aufrufen. Stellen Sie eine Option mit einem Pluszeichen vor Optionen mit Minuszeichen, kombiniert Lsof sie normalerweise auch problemlos: +M -a entspricht +Ma. Im Zweifelsfall sollten Sie die Optionen jedoch einzeln angeben beziehungsweise in Gruppen mit dem entsprechenden Prefix zusammenfassen.

Geben Sie nichts anderes an, verknüpft Lsof die Optionen intern mit einem logischen Oder (Bedingung1 ODER Bedingung2). Durch Angabe der Option -a ändern Sie das: Nun verwendet Lsof ein logisches Und (Bedingung1 UND Bedingung2). Außerdem können Sie mit einem Caret (^) Bedingungen negieren, etwa um mittels -u ^UID eine UID auszuschließen. Dies entspricht in etwa der Syntax von Gruppen in regulären Ausdrücken.

Ausgaben

Starten Sie Lsof ohne Optionen, so listet es alle momentan geöffneten Dateien aller vorhandenen Prozesse auf (Listing 1). Ganz am Anfang enthält die Ausgabe dabei einmal eine kurze Info-Zeile mit den Spaltenbezeichnern. Nach vielen dieser Spalten können Sie die Ausgaben sortieren lassen beziehungsweise deren Ausgabe durch Optionen einschränken. In der Vorgabe sortiert Lsof die Ausgabe nach der ersten Spalte (COMMAND), sodass alle Angaben zu einem Prozess zusammen erscheinen. Dies entspricht einer Sortierung nach der Prozess-ID (PID).

Listing 1

$ lsof
COMMAND  PID  USER   FD  TYPE  DEVICE  SIZE/OFF    NODE  NAME
systemd    1  root  cwd   DIR     8,6      4096       2  /
systemd    1  root  rtd   DIR     8,6      4096       2  /
systemd    1  root  txt   REG     8,6   1511624  400489  /usr/lib/systemd/systemd
systemd    1  root  mem   REG     8,6     19024  413874  /usr/lib/libuuid.so.1.3.0
[...]

Unter User finden Sie den Namen des zugehörigen Benutzers, nicht aber dessen UID. Es folgt die Spalte mit den File-Deskriptoren (FD), die Kanäle zu bestimmten Dateien beziehungsweise Verzeichnissen herstellen. Die wichtigsten der hier möglichen Angaben zeigt die Tabelle “File-Deskriptoren”.

Bei numerischen Angaben, gefolgt von einem oder mehreren Buchstaben, handelt es sich um eine Deskriptor-Nummer samt Angaben zum Dateizugriff. Beim ersten Buchstaben steht r für Lesezugriff, w für Schreibzugriff und u für beides. Der nicht immer vorhandene zweite Buchstabe bezeichnet die Art des File-Lockings. Auch hier gibt es wieder r, w und u und darüber hinaus Varianten mit Großbuchstaben. Daraus lässt sich erkennen, ob Teile der Datei (Kleinbuchstaben) oder das gesamte File (Großbuchstaben) für den Zugriff gesperrt wurden. Genaueres dazu finden Sie bei Interesse in der Sektion LOCKS der Lsof-Manpage.

File-Deskriptoren

Deskriptor Bedeutung
cwd Current Working Directory (Arbeitsverzeichnis)
txt Textdatei (Code und Daten)
rtd Root Directory (Wurzelverzeichnis)
mem Memory-mapped File (meist Bibliotheken)
mmap Memory-mapped Device (Gerätezugriff)
ltx Shared Library Text (Code und Daten)
err FD Information Error (Zugriffsfehler)
pd Parent Directory (Elternverzeichnis)

Das nächste Feld (die nächste Spalte) enthält einen TYPE für den File-Deskriptor. Diese kennzeichnet die Art der Verbindung, also ob es sich um eine lokale Datei, eine Pipe, eine FIFO-Queue, eine Netzwerkverbindung und so weiter handelt. Die häufigsten Varianten zeigt die Tabelle “FD-Typen”.

FD-Typen

Typ Bedeutung
REG reguläre lokale Datei
DIR Verzeichnis
PIPE Pipe
IPv4, IPv6 IP-Verbindung (Socket)
DEL gelöschte Datei
BLK Block-Device
CHR Character-Device

Die unter DEVICE angegebene Zahlenkombination verrät, mit welchem Gerät eine Verbindung besteht. Die zugehörige Dateigröße finden Sie unter SIZE/OFF. Besonders wichtig ist die mit NAME bezeichnete Spalte, die Pfad und Name der geöffneten Datei enthält – zumindest, solange es sich um eine reguläre, lokale Datei handelt.

Praxis

Lsof liefert sehr viel mehr Informationen, als Sie in den meisten Fällen tatsächlich benötigen. In der Regel ist es daher sinnvoll, mittels eines Filters gezielt die für Sie relevanten Angaben aus dem Datenstrom herauszufischen. Dazu kommt oft Grep zum Einsatz; alternativ greifen Sie auf einen Pager zurück, also ein seitenweise anzeigendes Programm wie less oder more:

$ lsof | less -j22p Suchbegriff

Mittels -j22 zeigt Less den Treffer nicht mehr am oberen Rand des Fensters an, sondern in Zeile 22, bei einem Fullscreen-Terminalfenster also etwa in der Mitte des Bildschirms. So können Sie auch den Kontext des Treffers erkennen. Die Option -p Suchbegriff definiert das Suchmuster, analog zu Grep.

Auch Lsof selbst offeriert Optionen, um die Ausgaben zu filtern. Mit dem Schalter -c Muster grenzen Sie beispielsweise die zu berücksichtigenden Prozesse ein. Das zu suchende Muster darf aus einer Zeichenkette (etwa einem Prozess- oder Programmnamen) oder auch einem regulären Ausdruck bestehen – Letzteren schließen Sie zwischen Slashes (/) ein.

Mit lsof /dev/sdc1 finden Sie schnell heraus, welche(r) Prozess(e) beispielsweise auf ein Gerät beziehungsweise eine Partition zugreifen. Möchten Sie wissen, welche Prozesse Lock-Dateien unter /var/lock/ verwenden, tippen Sie lsof +D /var/lock/. Fällt die Ausgabe dann immer noch zu umfangreich aus, schränken Sie sie auf Prozesse ein, die beispielsweise mit sys und cup beginnen:

$ lsof -c sys -c cup [...]

Optionen, die Ausgaben steuern, kombiniert Lsof wie schon erwähnt automatisch per logischem Oder. Möchten Sie nur Zeilen zu sehen bekommen, bei denen zwei Optionen gleichzeitig zutreffen, aktivieren Sie über lsof -a den Und-Modus.

Um lediglich die Prozesse eines bestimmten Benutzers unter die Lupe zu nehmen, etwa jene von Root, verwenden Sie die Option -u. Als Argument verarbeitet Lsof sowohl den Usernamen (root) als auch die PID (0). Um alle durch Lsof ermittelten Prozesse eines bestimmten Benutzers zu terminieren, verwenden Sie die Option -t: Damit erhalten Sie eine Ausgabe, die sich direkt als Argument für Kill verwenden lässt:

$ kill $(lsof -tu User)

Relativ oft benötigt man Informationen, welche Dateien ein spezieller Prozess auf welche Weise geöffnet hat. Dazu ermitteln Sie zunächst die PID des Prozesses (etwa mithilfe von Ps) und übergeben diese anschließend als Argument von -p an Lsof:

$ lsof -p PID

Dies liefert Ihnen alle durch den angegebenen Prozess geöffneten Dateien, einschließlich der verwendeten Libraries. Um Letztere auszuschließen, filtern Sie die Ausgabe gegebenenfalls einfach mittels grep -v '/lib/'.

Eine Besonderheit von Lsof stellt der sogenannte Repeat-Modus dar, den Sie mit der Option -r aktivieren: In diesem Fall erfolgt die Ausgabe mehrfach in festen Intervallen, in der Vorgabe alle 15 Sekunden. Mit -r Sekunden ändern Sie den Zeitabstand, der aber mindestens 2 Sekunden betragen muss.

Netzwerkeln

Da Linux Netzwerkverbindungen wie Dateien behandelt, kann Lsof diese analog zu den normalen Dateizugriffen behandeln. Mit der Option -i aufgerufen, listet Lsof alle aktuellen Netzwerkverbindungen auf. Als normaler Benutzer bekommen Sie hier in der Regel nur die Verbindungen der Mail-Clients, des Webbrowsers und eventuell eines Dropbox-Clients zu sehen. Das sieht als Root schon ganz anders aus, da beispielsweise das Drucksystem via CUPS, der DHCP-Client, der Zeroconf-Client Avahi und wahrscheinlich auch der Netzwerkzeit-Dämon Ntpd laufen.

Die Option -i 6 reduziert die Lsof-Ausgaben auf Verbindungen vom Typ IPv6, -i 4 auf die IPv4-Verbindungen. Zusammen mit -a und einer PID lassen sich schnell alle Netzwerkverbindungen eines bestimmten Prozesses ermitteln:

$ lsof -a -i -p PID

Auch die an einem bestimmten Port lauschenden Prozesse findet Lsof auf Wunsch. Dazu verwenden Sie ebenfalls die Option -i, geben als Argument dann aber die mit einem Doppelpukt versehene Portnummer an. So listet lsof -i :22 etwa alle SSH-Verbindungen auf.

Alle TCP-Verbindungen sehen Sie mit lsof -i TCP ein. Durch den Zusatz :ESTABLISHED begrenzen Sie die Ausgabe mit lsof -i -sTCP:ESTABLISHED auf etablierte Verbindungen. Analog funktioniert das Ganze mit lsof -i UDP für UDP-Verbindungen, mit lsof -i -sTCP:LISTEN für offene Ports oder mit lsof -iIP[:Port] für Verbindungen zu bestimmten Gegenstellen und Ports.

GUI

Weil die Arbeit mit Lsof Anfänger schnell überfordert, entwickelte Daniele Francesconi eine grafische Oberfläche, über die alle wichtigen Lsof-Optionen zur Verfügung stehen und die die umfangreichen Ausgaben halbwegs übersichtlich darstellt. Das Java-Werkzeug hört auf den Namen Glsof [3] und besteht eigentlich aus zwei Komponenten: Glsof-Filemonitor [4] heißt die einfache Oberfläche aus Abbildung 1, Glsof-Query dient dem Verwalten mehrfacher Lsof-Instanzen [5] und kommt nur in größeren Installationen zum Einsatz.

Abbildung 1: Der Glsof-Filemonitor stellt eine leistungsfähige Oberfläche für Lsof bereit.

Abbildung 1: Der Glsof-Filemonitor stellt eine leistungsfähige Oberfläche für Lsof bereit.

Um Glsof-Filemonitor zu verwenden, laden Sie das Programmarchiv von Sourceforge in ein beliebiges Verzeichnis herunter und entpacken es. Dabei entsteht der neue Ordner filemonitor/ mit allen notwendigen Dateien. Dann rufen Sie die GUI mit dem Befehl aus Listing 2 auf. Um Glsof-Filemonitor zu verwenden, müssen Sie zunächst eine Konfiguration anlegen. Das erledigen Sie im “Hamburger”-Menü ganz rechts in der Kopfzeile unter dem Punkt Preferences.

Listing 2

$ java -Djava.security.policy=/Pfad/filemonitor/security-client.txt -jar /Pfad/filemonitor/filemonitor.jar

Eine solche später wiederverwendbare und auch nachträglich editierbare Konfiguration legen Sie über einen Klick auf das Pluszeichen in der Werkzeugleiste neu an. Zunächst vergeben Sie einen Namen dafür, im daraufhin erscheinenden Dialog legen Sie die zugehörigen Optionen und Parameter fest. Voreingestellt verwendet Filemonitor Lsof mit den Optionen -F -T +c0 -o -n -P, um die Ausgaben zu erzeugen. Die Filemonitor-Option Avoid steht übrigens für das Lsof-Pendant -b, verzichtet also auf blockierende Funktionen.

Ein Klick auf Save speichert die Konfiguration (Abbildung 2), die Sie nun in den Preferences per Radio-Button markieren. Dann starten Sie durch einen Mausklick auf den grünen Schalter rechts oben im Programmfenster die Datenerfassung. Sie können die angezeigten Informationen jederzeit filtern, indem Sie entsprechende Texte in das Feld am oberen Rand eingeben. Daneben befindet sich ein Auswahlfeld, mit dem Sie den Filter auf einzelne Lsof-Spalten beschränken. Ein Klick auf das Trichter-Symbol aktiviert den Filter, einer auf den symbolischen Besen löscht ihn wieder und leert die gesamte Anzeige.

Abbildung 2: Die Konfiguration von Glsof-Filemonitor erledigen Sie über den Dialog <code srcset=

Preferences.” width=”300″ height=”155″ /> Abbildung 2: Die Konfiguration von Glsof-Filemonitor erledigen Sie über den Dialog Preferences.

Fazit

Das Bordmittel Lsof zählt zu den echten Powertools für Linux und erweist sich bei Problemen vielerlei Art als wertvolle Diagnosehilfe. Als Grundvoraussetzung dazu muss der Anwender allerdings ein halbwegs fundiertes Wissen um die internen Zusammenhänge des Systems mitbringen. Aber auch weniger versierte User gelangen mit Lsof an Informationen, die ihnen simplere Programme wie Fuser nicht bieten, insbesondere im Zusammenhang mit blockierten Ressourcen. Vor dem Einsatz von Lsof sollten Sie aber auf jeden Fall einen Blick in die Manpage sowie in die FAQ [2] werfen, die zahlreiche nützliche Informationen und Tipps bereithalten. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 04/2016 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben