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.
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.

Preferences.” width=”300″ height=”155″ />
Abbildung 2: Die Konfiguration von Glsof-Filemonitor erledigen Sie über den DialogPreferences.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.
Infos
[1] Lsof: http://people.freebsd.org/~abe/
[2] Lsof-FAQ: http://gd.tuwien.ac.at/utils/admin-tools/lsof/FAQ
[3] Glsof: http://glsof.sourceforge.net/
[4] Filemonitor: http://glsof.sourceforge.net/filemonitor/
[5] Queries: http://glsof.sourceforge.net/queries/






