So verwenden Sie den Linux-Befehl lsof

Wenn alles in Linux eine Datei ist, muss es mehr als nur Dateien auf Ihrer Festplatte geben. Dieses Tutorial zeigt Ihnen, wie Sie mit lsof alle anderen Geräte und Prozesse sehen, die als Dateien behandelt werden.

Unter Linux ist alles eine Datei

Der oft zitierte Satz, dass alles in Linux eine Datei ist, ist irgendwie wahr. Eine Datei ist eine Sammlung von Bytes. Wenn sie in ein Programm eingelesen oder an einen Drucker gesendet werden, scheinen sie einen Bytestrom zu erzeugen. Wenn auf sie geschrieben wird, akzeptieren sie einen Strom von Bytes.

Viele andere Systemkomponenten akzeptieren oder generieren Byte-Streams, wie Tastaturen, Socket-Verbindungen, Drucker und Kommunikationsprozesse. Da sie entweder Bytestreams akzeptieren, generieren oder akzeptieren und generieren, können diese Geräte – auf sehr niedriger Ebene – so behandelt werden, als wären sie Dateien.

Dieses Designkonzept vereinfachte die Implementierung des Unix-Betriebssystems. Dies bedeutete, dass ein kleiner Satz von Handlern, Tools und APIs erstellt werden konnte, um eine Vielzahl unterschiedlicher Ressourcen zu verarbeiten.

Die Daten- und Programmdateien, die sich auf Ihrer Festplatte befinden, sind einfache alte Dateisystemdateien. Wir können den Befehl ls verwenden, um sie aufzulisten und einige Details über sie herauszufinden.

Wie erfahren wir von all den anderen Prozessen und Geräten, die wie Dateien behandelt werden? Wir verwenden den Befehl lsof. Dies listet die geöffneten Dateien im System auf. Das heißt, es listet alles auf, was behandelt wird, als ob es eine Datei wäre.

Das lsof-Kommando

Viele der Prozesse oder Geräte, über die lsof berichten kann, gehören zu root oder wurden von root gestartet, daher müssen Sie den Befehl sudo mit lsof verwenden.

Und weil diese Auflistung sehr lang sein wird, werden wir sie weniger durchleiten.

sudo lsof | less

Bevor die lsof-Ausgabe erscheint, sehen GNOME-Benutzer möglicherweise eine Warnmeldung im Terminalfenster.

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.

lsof versucht, alle gemounteten Dateisysteme zu verarbeiten. Diese Warnmeldung wird ausgegeben, weil lsof auf a . gestoßen ist Virtuelles GNOME-Dateisystem (GVFS). Dies ist ein Sonderfall von a Dateisystem im Benutzerbereich (SICHERUNG). Es fungiert als Brücke zwischen GNOME, seinen APIs und dem Kernel. Niemand – nicht einmal root – kann auf eines dieser Dateisysteme zugreifen, außer dem Besitzer, der es gemountet hat (in diesem Fall GNOME). Sie können diese Warnung ignorieren.

Die Ausgabe von lsof ist sehr breit. Die Spalten ganz links sind:

Die Spalten ganz rechts sind:

Die lsof-Spalten

Nicht alle Spalten gelten für jeden geöffneten Dateityp. Es ist normal, dass einige von ihnen leer sind.

Befehl: Der Name des Befehls, der dem Prozess zugeordnet ist, der die Datei geöffnet hat.
PID: Prozess-Identifikationsnummer des Prozesses, der die Datei geöffnet hat.
TID: Task (Thread) Identifikationsnummer. Eine leere Spalte bedeutet, dass es sich nicht um eine Aufgabe handelt; es ist ein prozess.
Benutzer: Benutzer-ID oder Name des Benutzers, zu dem der Prozess gehört, oder die Benutzer-ID oder das Login der Person, die das Verzeichnis in /proc besitzt, in dem lsof Informationen über den Prozess findet.
FD: Zeigt den Dateideskriptor der Datei an. Dateideskriptoren werden unten beschrieben.
Typ: Typ des mit der Datei verknüpften Knotens. Hinweistypen werden im Folgenden beschrieben.
Gerät: Enthält entweder die durch Kommas getrennten Gerätenummern für eine Sonderzeichen-, Blocksonder-, Regulär-, Verzeichnis- oder NFS-Datei oder eine Kernel-Referenzadresse, die die Datei identifiziert. Es kann auch die Basisadresse oder den Gerätenamen eines Linux-AX.25-Socket-Geräts anzeigen.
Größe/Aus: Zeigt die Größe der Datei oder den Datei-Offset in Bytes an.
Knoten: Zeigt die Knotennummer einer lokalen Datei oder die Inode-Nummer einer NFS-Datei im Server-Host oder den Internetprotokolltyp an. Es kann STR für einen Stream oder die IRQ- oder Inode-Nummer eines Linux-AX.25-Socket-Geräts anzeigen.
Name: Zeigt den Namen des Mount-Punkts und des Dateisystems an, auf dem sich die Datei befindet.

  So installieren und richten Sie Plex Media Server unter Linux ein

Die FD-Kolumne

Der Dateideskriptor in der Spalte FD kann eine von vielen Optionen sein; die manpage liste sie alle auf.

Der FD-Spalteneintrag kann aus drei Teilen bestehen: einem Dateideskriptor, einem Moduszeichen und einem Sperrzeichen. Einige gängige Dateideskriptoren sind:

cwd: Aktuelles Arbeitsverzeichnis.
err: FD-Informationsfehler (siehe Spalte NAME).
ltx: Gemeinsam genutzter Bibliothekstext (Code und Daten).
m86: DOS-Merge-zugeordnete Datei.
mem: Speicherabgebildete Datei.
mmap: Speicherzugeordnetes Gerät.
pd: Übergeordnetes Verzeichnis.
rtd: Root-Verzeichnis.
txt: Programmtext (Code und Daten)
Eine Zahl, die einen Dateideskriptor darstellt.

Das Moduszeichen kann eines der folgenden sein:

r: Lesezugriff.
w: Schreibzugriff.
u: Lese- und Schreibzugriff.
‚ ‚: Ein Leerzeichen, wenn der Modus unbekannt ist und kein Sperrzeichen vorhanden ist.
–: Modus unbekannt und es gibt ein Sperrzeichen.

Das Sperrzeichen kann eines der folgenden sein:

r: Lesesperre für einen Teil der Datei.
R: Lesesperre für die gesamte Datei.
w: Schreibsperre auf einen Teil der Datei.
W: Schreibsperre auf die gesamte Datei.
u: Lese- und Schreibsperre beliebiger Länge.
U: Unbekannter Schlosstyp.
‚ ‚: Ein Leerzeichen. Kein Schloss.

Die TYPE-Spalte

Es gibt über 70 Einträge die in der Spalte TYPE erscheinen können. Einige häufige Einträge, die Sie sehen werden, sind:

REG: Reguläre Dateisystemdatei.
DIR: Verzeichnis.
FIFO: First In First Out.
CHR: Spezielle Zeichendatei.
BLK: Spezialdatei blockieren.
INET: Internet-Steckdose.
unix: UNIX-Domain-Socket

Siehe Prozesse, die eine Datei geöffnet haben

Um die Prozesse anzuzeigen, die eine bestimmte Datei geöffnet haben, geben Sie den Namen der Datei als Parameter für lsof an. Um beispielsweise die Prozesse anzuzeigen, die die Datei kern.log geöffnet haben, verwenden Sie diesen Befehl:

sudo lsof /var/log/kern.log

lsof antwortet, indem es den einzelnen Prozess rsyslogd anzeigt, der vom Benutzer syslog gestartet wurde.

Alle aus einem Verzeichnis geöffneten Dateien anzeigen

Um die Dateien anzuzeigen, die aus einem Verzeichnis geöffnet wurden, und die Prozesse, die sie geöffnet haben, übergeben Sie das Verzeichnis als Parameter an lsof. Sie müssen die Option +D (Verzeichnis) verwenden.

Um alle Dateien anzuzeigen, die im Verzeichnis /var/log/ geöffnet sind, verwenden Sie diesen Befehl:

sudo lsof +D /var/log/

lsof antwortet mit einer Liste aller geöffneten Dateien in diesem Verzeichnis.

Um alle Dateien anzuzeigen, die aus dem /home-Verzeichnis geöffnet wurden, verwenden Sie den folgenden Befehl:

sudo lsof +D /home

Die Dateien, die aus dem /home-Verzeichnis geöffnet wurden, werden angezeigt. Beachten Sie, dass bei kürzeren Beschreibungen in einigen Spalten die gesamte Auflistung enger ist.

Von einem Prozess geöffnete Dateien auflisten

Um die Dateien anzuzeigen, die von einem bestimmten Prozess geöffnet wurden, verwenden Sie die Option -c (Befehl). Beachten Sie, dass Sie lsof mehrere Suchbegriffe gleichzeitig bereitstellen können.

sudo lsof -c ssh -c init

lsof bietet eine Liste der Dateien, die von einem der in der Befehlszeile bereitgestellten Prozesse geöffnet wurden.

  So spielen Sie Company of Heroes unter Linux

Von einem Benutzer geöffnete Dateien anzeigen

Um die Anzeige auf die Dateien zu beschränken, die von einem bestimmten Benutzer geöffnet wurden, verwenden Sie die Option -u (Benutzer). In diesem Beispiel sehen wir uns die Dateien an, die von Prozessen geöffnet wurden, die im Besitz von Mary sind oder in ihrem Namen gestartet wurden.

sudo lsof -u mary

Alle aufgeführten Dateien wurden im Namen der Benutzerin Mary geöffnet. Dazu gehören beispielsweise Dateien, die von der Desktop-Umgebung geöffnet wurden oder einfach dadurch, dass Mary sich eingeloggt hat.

Ausschließen von Dateien, die von einem Benutzer geöffnet wurden

Um die von einem Benutzer geöffneten Dateien auszuschließen, verwenden Sie den ^-Operator. Das Ausschließen von Benutzern aus der Liste erleichtert das Auffinden der für Sie interessanten Informationen. Sie müssen wie zuvor die Option -u verwenden und das Zeichen ^ an den Anfang des Benutzernamens hinzufügen.

sudo lsof +D /home -u ^mary

Diesmal enthält die Auflistung für das Verzeichnis /home keine der Dateien, die von der Benutzerin Mary geöffnet wurden.

Von einem Prozess geöffnete Dateien auflisten

Um die Dateien aufzulisten, die von einem bestimmten Prozess geöffnet wurden, verwenden Sie die Option -p (Prozess) und geben Sie die Prozess-ID als Parameter an.

sudo lsof - p 4610

Alle Dateien, die mit der von Ihnen angegebenen Prozess-ID geöffnet wurden, werden für Sie aufgelistet.

Auflisten von Prozess-IDs, die eine Datei geöffnet haben

Um die Prozess-IDs der Prozesse anzuzeigen, die eine bestimmte Datei geöffnet haben, verwenden Sie die Option -t (kurz gefasst) und geben Sie den Namen der Datei in der Befehlszeile ein.

sudo lsof -t /usr/share/mime/mime.cache

Die Prozess-IDs werden in einer einfachen Liste angezeigt.

Verwenden Sie UND- und ODER-Suchen

Lassen Sie uns die Dateien auflisten, die von Benutzer Mary geöffnet wurden und sich auf die SSH-Prozesse beziehen. Wir wissen, dass wir mehr als einen Suchbegriff auf der Befehlszeile bereitstellen können, daher sollte dies einfach sein.

sudo lsof -u mary -c ssh

Schauen wir uns nun die Ausgabe von lsof an. Das sieht nicht richtig aus; es gibt Einträge in der Ausgabe, die von root gestartet wurden.

Das haben wir nicht erwartet. Was ist passiert?

Wenn Sie mehrere Suchbegriffe angeben, gibt lsof jede Datei zurück, die mit dem ersten Suchbegriff oder dem zweiten Suchbegriff übereinstimmt usw. Mit anderen Worten, es führt eine ODER-Suche durch.

Verwenden Sie die Option -a (und), damit lsof eine UND-Suche durchführt. Das bedeutet, dass nur Dateien aufgelistet werden, die dem ersten Suchbegriff, dem zweiten Suchbegriff usw. entsprechen.

Versuchen wir es noch einmal und verwenden Sie die Option -a.

sudo lsof -u mary -c ssh -a

Jetzt ist jede Datei in der Liste eine, die von oder im Namen von Mary geöffnet wurde und mit dem SSH-Befehl verknüpft ist.

Automatisches Aktualisieren der Anzeige

Wir können die Option +|-r (repeat) verwenden, um lsof in den Wiederholungsmodus zu versetzen. Die Wiederholungsoption kann auf zwei Arten angewendet werden, entweder +r oder -r. Wir müssen auch die Anzahl der Sekunden hinzufügen, die lsof warten soll, bevor die Anzeige aktualisiert wird.

  So installieren Sie Debian 9 Linux auf einem Heimserver

Wenn Sie die Wiederholungsoption in beiden Formaten verwenden, zeigt lsof die Ergebnisse wie gewohnt an, fügt jedoch am unteren Rand der Anzeige eine gestrichelte Linie hinzu. Es wartet die in der Befehlszeile angegebene Anzahl von Sekunden und aktualisiert dann die Anzeige mit einem neuen Ergebnissatz.

Mit der Option -r wird dies fortgesetzt, bis Sie Strg+C drücken. Beim +r-Format wird es so lange fortgesetzt, bis keine Ergebnisse mehr angezeigt werden können oder bis Sie Strg+C drücken.

sudo lsof -u mary -c ssh -a -r5

Beachten Sie die gestrichelte Linie am Ende der Auflistung. Dies trennt jede neue Anzeige von Daten, wenn die Ausgabe aktualisiert wird.

Anzeigen von Dateien, die mit Internetverbindungen verknüpft sind

Mit der Option -i (Internet) können Sie die Dateien anzeigen, die von Prozessen geöffnet wurden, die mit Netzwerk- und Internetverbindungen verbunden sind.

lsof -i

Alle über Netzwerk- und Internetverbindungen geöffneten Dateien werden angezeigt.

Anzeigen von Dateien, die mit Internetverbindungen verknüpft sind, nach Prozess-ID

Um die von Internetverbindungen geöffneten Dateien anzuzeigen, die einer bestimmten Prozess-ID zugeordnet sind, fügen Sie die Option -p und die Option -a hinzu.

Hier suchen wir nach Dateien, die über eine Internet- oder Netzwerkverbindung von einem Prozess mit der ID 606 geöffnet wurden.

sudo lsof -i -a -p 606

Alle mit der Prozess-ID 606 geöffneten Dateien, die Internet- oder Netzwerkverbindungen zugeordnet sind, werden angezeigt.

Anzeigen von Dateien, die mit Internetverbindungen und Befehlen verknüpft sind

Wir können die Option -c (Befehl) verwenden, um nach Dateien zu suchen, die von bestimmten Prozessen geöffnet wurden. Um nach Dateien zu suchen, die über Internet- oder Netzwerkverbindungen im Zusammenhang mit dem ssh-Prozess geöffnet wurden, verwenden Sie den folgenden Befehl:

lsof -i -a -c ssh

Alle Dateien, die aufgrund der ssh-Prozesse geöffnet wurden, werden in der Ausgabe aufgelistet.

Anzeigen von Dateien, die mit Internetverbindungen und Ports verknüpft sind

Wir können einen lsof-Bericht über die Dateien erstellen, die über Internet- oder Netzwerkverbindungen an einem bestimmten Port geöffnet wurden. Dazu verwenden wir das Zeichen : gefolgt von der Portnummer.

Hier bitten wir lsof, die Dateien aufzulisten, die über Netzwerk- oder Internetverbindungen über Port 22 geöffnet wurden.

lsof -i :22

Alle aufgelisteten Dateien wurden von Prozessen geöffnet, die Port 22 zugeordnet sind (der Standardport für SSH-Verbindungen).

Anzeigen von Dateien, die mit Internetverbindungen und Protokollen verknüpft sind

Wir können lsof bitten, die Dateien anzuzeigen, die von Prozessen geöffnet wurden, die mit Netzwerk- und Internetverbindungen verbunden sind und ein bestimmtes Protokoll verwenden. Wir können zwischen TCP, UDP und SMTP wählen. Lassen Sie uns das TCP-Protokoll verwenden und sehen, was wir bekommen.

sudo lsof -i tcp

Die einzigen aufgelisteten Dateien sind diejenigen, die von Prozessen geöffnet wurden, die das TCP-Protokoll verwenden.

Wir haben nur an der Oberfläche gekratzt

Das ist eine gute Grundlage für einige gängige Anwendungsfälle für lsof, aber es steckt noch viel mehr dahinter. Wie viel mehr lässt sich daran erkennen, dass die Manpage über 2.800 Zeilen lang ist.

Der Befehl lsof kann verwendet werden, um immer tiefer in die Schichten offener Dateien und Pseudodateien einzudringen. Wir haben eine Kartenskizze bereitgestellt; der Atlas ist da die manpage.