Detaillierte Erklärung der Verwendung des Linux-Befehls lsof

Detaillierte Erklärung der Verwendung des Linux-Befehls lsof

lsof (List Open Files) ist ein Tool zum Anzeigen von von einem Prozess geöffneten Dateien.

Unter Linux ist alles eine Datei. Dateien ermöglichen nicht nur den Zugriff auf normale Daten, sondern auch auf Netzwerkverbindungen und Hardware. Daher kann der Befehl lsof nicht nur die vom Prozess geöffneten Dateien und Verzeichnisse anzeigen, sondern auch die Socket-bezogenen Informationen, wie z. B. die vom Prozess abgehörten Ports. Dieser Artikel stellt die grundlegende Verwendung des Befehls lsof vor. Die Demonstrationsumgebung in diesem Artikel ist Ubuntu 18.04.

Allgemeine Optionen

-a gibt an, dass die anderen Optionen in einer UND-Beziehung stehen
-c <Prozessname> Vom angegebenen Prozess geöffnete Ausgabedateien
-d <Dateideskriptor> listet die Prozesse auf, die die Dateinummer belegen
+d <Verzeichnis> Ausgabeverzeichnis und geöffnete Dateien und Verzeichnisse unter dem Verzeichnis (nicht rekursiv)
+D <Verzeichnis> gibt rekursiv die im Verzeichnis geöffneten Dateien und Verzeichnisse aus
-i <Bedingung> Netzwerkbezogene Dateien ausgeben, die die Bedingungen erfüllen
-n Hostnamen nicht auflösen
-p <Prozessnummer> Gibt die vom Prozess mit der angegebenen PID geöffneten Dateien aus
-P Portnummern nicht auflösen
-t gibt nur PID aus
-u Vom angegebenen Benutzer geöffnete Ausgabedateien
-U Gibt die geöffnete UNIX-Domain-Socket-Datei aus
-h Hilfeinformationen anzeigen
-v Versionsinformationen anzeigen

Grundlegende Ausgabe

Wenn Sie den Befehl lsof ohne Optionen ausführen, werden alle von allen aktiven Prozessen im System geöffneten Dateien ausgegeben. Infolgedessen werden wir von den Ausgabeinformationen überwältigt, die keinen Sinn ergeben. Lassen Sie den Befehl lsof zunächst die vom aktuellen Bash-Prozess geöffneten Dateien ausgeben und fangen Sie dann einen Teil der Ergebnisse ab, um festzustellen, welche Informationen in der Ausgabe enthalten sind:

BEFEHL: Der Name des Programms
PID: Prozesskennung
BENUTZER: Prozessbesitzer
FD: Dateideskriptor, die Anwendung identifiziert die Datei über den Dateideskriptor
TYP: Dateityp, z. B. DIR, REG usw.
DEVICE: durch Kommas getrennte Gerätenummern
GRÖSSE: Dateigröße (Bytes)
NODE: Indexknoten (die Kennung der Datei auf der Festplatte)
NAME: Der genaue Name der zu öffnenden Datei

Nachfolgend finden Sie eine kurze Einführung in die gemeinsamen Inhalte der Spalten FD und TYPE.
Zu den üblichen Inhalten in der Spalte „FD“ gehören cwd, rtd, txt, mem und einige Zahlen usw. Dabei steht cwd für das aktuelle Arbeitsverzeichnis, rtd für das Stammverzeichnis, txt für die ausführbare Datei des Programms und mem für die im Speicher abgebildete Datei:

Einige FDs werden durch Zahlen dargestellt, z. B. Standard-Eingabe- und Ausgabedateien:

Der Buchstabe nach der Zahl gibt den Lese-/Schreibmodus des Prozesses für die Datei an. Beispielsweise bedeutet u in der obigen Abbildung, dass die Datei geöffnet ist und sich im Lese-/Schreibmodus befindet. Neben u gibt es auch r für Nur-Lese-Modus, w für Nur-Schreib-Modus und W für Nur-Schreib-Modus. Mit W können Sie außerdem angeben, dass der Prozess eine Schreibsperre für die Datei hat. Die folgende Abbildung ist eine Liste der vom Docker-Daemon-Prozess geöffneten Dateien und zeigt verschiedene FD-Modi:

Die gemeinsamen REG- und DIR-Werte in der Spalte TYPE stellen jeweils normale Dateien und Verzeichnisse dar. CHR und BLK stehen jeweils für Zeichen- und Blockgeräte, und unix, fifo und IPv4/IPv6 stehen jeweils für UNIX-Domänen-Sockets, First-In-First-Out-Warteschlangen (FIFO) und IPv4/IPv6-Sockets.

Nachfolgend stellen wir einige gängige Verwendungen des Befehls lsof vor.

Überprüfen Sie, welche Prozesse eine Datei geöffnet haben

Geben Sie einfach den Dateinamen als Argument für lsof an, um zu sehen, welche Prozesse die Datei geöffnet haben. Der folgende Befehl fragt die Prozesse ab, die die Datei /bin/bash geöffnet haben:

$ sudo lsof /bin/bash 

Neben normalen Dateien können dies auch Gerätedateien sein (die Ausgabe des folgenden Befehls ist sehr lang und die Abbildung stellt nur einen kleinen Teil davon dar):

$ sudo lsof /dev/sda1 

Überprüfen Sie, welche Prozesse ein Verzeichnis und die darin enthaltenen Dateien geöffnet haben

Hier gibt es zwei Fälle. Die Option +d führt keine rekursiven Abfragen aus, sondern sucht nur nach Prozessen, die das angegebene Verzeichnis geöffnet haben, sowie nach Dateien und Verzeichnissen unter dem angegebenen Verzeichnis, zum Beispiel:

$ sudo lsof +d /var/log 

Mit der Option +D gelangen Sie rekursiv in das angegebene Verzeichnis:

$ sudo lsof +D /var/log 

Wenn Sie ein Dateisystem aushängen und ein Prozess Dateien oder Verzeichnisse im Dateisystem geöffnet hat, schlägt der Aushängevorgang fehl. Daher ist es am besten, vor dem Unmounten des Dateisystems den Einhängepunkt des Dateisystems über lsof +D zu prüfen, die zugehörigen Prozesse zu beenden und dann den Unmount-Vorgang durchzuführen.

Alle von einem Prozess geöffneten Dateien anzeigen

Mit der Option -p und der Angabe der PID eines Prozesses können Sie alle von diesem Prozess geöffneten Dateien ausgeben. Wenn wir beispielsweise die vom Cron-Programm geöffneten Dateien anzeigen möchten, können wir zunächst den Cron-Befehl ps -C verwenden, um die PID des Prozesses herauszufinden:

Übergeben Sie dann die PID an die Option -p des Befehls lsof:

$ sudo lsof -p 1152 

Mehrere Optionen kombinieren

Wenn Sie mehrere Optionen für den Befehl lsof angeben, ist die Standardbeziehung zwischen diesen Optionen ODER. Das heißt, es werden die Ergebnisse ausgegeben, die einer beliebigen Option entsprechen. Sie können eine zusätzliche Option -a hinzufügen, die die Beziehung zwischen anderen Optionen zu einem UND macht, wie etwa mit dem folgenden Befehl:

$ sudo lsof -a -p $$ -d0,1,2 

Die Option -p gibt die PID des aktuellen Prozesses an und die Option -d wird verwendet, um die vom Prozess geöffneten Dateideskriptoren anzugeben (mehrere Dateideskriptoren können durch Kommas getrennt werden). Nach dem Hinzufügen der Option -a besteht die Ausgabe aus den vom aktuellen Prozess geöffneten Dateien mit den Dateideskriptoren 0, 1 und 2.
Hinweis: Es gibt viele Bedingungen für die Verwendung der Option -a. Weitere Informationen finden Sie auf der Manpage von lsof.

Von einem Programm mit einem bestimmten Namen geöffnete Dateien anzeigen

Mit der Option -c kann der Name des Programms (der ausführbaren Datei) abgeglichen werden, das den Prozess ausführt. Wir möchten beispielsweise eine Liste der von Programmen geöffneten Dateien finden, die mit dem Buchstaben „cr“ beginnen:

$ sudo lsof -c cr 

Sie können auch mehrere -c-Optionen gleichzeitig angeben. Die Beziehung zwischen ihnen ist ODER.
Wenn Sie die Bedingung der Option -c negieren möchten, fügen Sie einfach das Symbol ^ vor der Zeichenfolge hinzu, zum Beispiel:

$ sudo lsof -c ^cr

Die Option -c unterstützt auch reguläre Ausdrücke. Der folgende Befehl kann beispielsweise Dateien herausfiltern, die von Programmen geöffnet wurden, die mit cra und cro beginnen:

$ sudo lsof -c /cr[ao]/

Geöffnete netzwerkbezogene Dateien anzeigen

Mit der Option -i können Sie geöffnete netzwerkbezogene Dateien anzeigen. Das Format der Parameter ist wie folgt:
[46][Protokoll][@Hostname|Hostadresse][:Dienst|Port]
46 gibt die Version des IP-Protokolls an
Protokoll steht für den Namen des Netzwerkprotokolls, z. B. TCP oder UDP
Hostname oder Hostaddr gibt die Hostadresse an
service bezieht sich auf den Namen in /etc/services, wie z.B. smtp oder eine Liste mehrerer Dienste
port gibt die Portnummer an. Sie können einen oder mehrere

Die Option -i gibt standardmäßig sowohl mit IPv4 als auch mit IPv6 geöffnete Dateien aus:

$ sudo lsof -ich 

Nur mit IPv4 oder IPv6 geöffnete Dateien auflisten

$ sudo lsof -i 4
$ sudo lsof -i 6 

Auflisten von Dateien im Zusammenhang mit Port 22

$ sudo lsof -i:22 

Listet offene TCP-Ports in einem angegebenen Bereich auf

$ sudo -i TCP:1-1024 

Zeigen Sie die geöffnete UNIX-Domain-Socket-Datei an

Die Option -U gibt die geöffnete UNIX-Domain-Socket-Datei aus. Hier kombinieren wir die Option -c, um die vom SSH-Dienst geöffnete UNIX-Domain-Socket-Datei anzuzeigen:

$ sudo lsof -a -c sshd -U

Alle von einem Benutzer geöffneten Dateien anzeigen

Mit der Option -u können Sie einen Benutzernamen oder eine Benutzer-ID angeben. Wie bei der Option -c können mehrere Benutzernamen oder Benutzer-IDs durch Kommas getrennt und die Bedingung durch das Symbol ^ negiert werden.
Alle von einem Benutzer geöffneten Dateien anzeigen

$ sudo lsof -u syslog

Netzwerkbezogene Dateien anzeigen, die vom Benutzer Nick geöffnet wurden

$ sudo lsof -a -i -u nick 

Einen Benutzer ausschließen

$ sudo lsof -i -u ^nick 

Hinweis: Wenn Ausschlussbedingungen vorliegen, ist es nicht erforderlich, die Option -a anzugeben.

Beenden Sie alle Prozesse, bei denen eine von einem bestimmten Benutzer geöffnete Datei vorhanden ist

$ kill -9 $(lsof -t -u nick)

Die Option -t im Befehl weist den Befehl lsof an, nur die PID des Prozesses auszugeben:

Zählen Sie die Gesamtzahl der vom System geöffneten Dateien

$ sudo lsof -P -n | 

Die Option -P im Befehl bedeutet, dass die Portnummer nicht aufgelöst wird, und die Option -n bedeutet, dass der Hostname nicht aufgelöst wird. Der Hauptzweck dieser beiden Optionen besteht darin, die Ausführungsgeschwindigkeit des lsof-Befehls zu verbessern. Mit dem Befehl wc -l können Sie die Anzahl der vom Befehl lsof ausgegebenen Zeilen zählen.

Gelöschte Dateien wiederherstellen

Wenn wir versehentlich eine Datei löschen und wissen, dass die Datei von einem Prozess geöffnet wird, können wir die Datei mit dem Befehl lsof wiederherstellen. Die konkreten Grundsätze sind:
Wenn ein Prozess eine Datei öffnet, bleibt sie auf der Festplatte, solange der Prozess die Datei geöffnet hält, selbst wenn die Datei gelöscht wird. Der Prozess erkennt nicht, dass die Datei gelöscht wurde, und kann mithilfe des Dateideskriptors, der ihm beim Öffnen der Datei bereitgestellt wurde, weiterhin darauf lesen und darin schreiben. Diese Datei ist für niemanden außer dem Prozess sichtbar, da der entsprechende Verzeichnis-Inode gelöscht wurde.

Die vom Prozess geöffneten Dateideskriptoren werden im Verzeichnis /proc/PID/fd gespeichert. Das Verzeichnis /proc ist in einem zugeordneten Bereich im Speicher gemountet, sodass diese Dateien und Verzeichnisse nicht auf der Festplatte vorhanden sind. Wenn wir diese Dateien lesen und schreiben, holen wir uns daher tatsächlich die relevanten Informationen aus dem Speicher. Das lsof-Programm verwendet diese und andere Informationen über den internen Zustand des Kernels, um seine Ausgabe zu erzeugen. So kann lsof Informationen wie den Dateideskriptor des Prozesses und zugehörige Dateinamen anzeigen. Das heißt, wir können relevante Informationen über die Datei finden, indem wir auf den Dateideskriptor des Prozesses zugreifen.

Die folgende Demo zeigt, wie mit dem Befehl lsof die versehentlich gelöschte Datei /var/log/syslog wiederhergestellt wird.

Löschen Sie zunächst die Protokolldatei /var/log/syslog. Denken Sie daran, diese Datei vorab zu sichern, nur für den Fall:

$ sudo rm /var/log/syslog 

Aus den obigen Informationen können wir ersehen, dass der Prozess mit PID 1141 die Datei geöffnet hat, der Dateideskriptor ist 7 und zeigt an, dass die Datei gelöscht wurde. Als nächstes betrachten wir den Inhalt der Datei über den Dateideskriptor des Prozesses 1141:

$ sudo tail -n 5 /proc/1141/fd/7 

Die obige Abbildung zeigt, dass der Inhalt der Datei /var/log/syslog noch vorhanden ist und über den Dateideskriptor abgerufen werden kann. Erstellen Sie als Nächstes die Datei /var/log/syslog durch IO-Umleitung neu:

$ sudo sh -c 'cat /proc/1141/fd/7 > /var/log/syslog'

Korrigieren Sie dann die Dateiberechtigungen und starten Sie den rsyslog-Dienst neu:

$ sudo chown syslog:adm /var/log/syslog
$ sudo systemctl rsyslog.service neu starten

Damit ist die Wiederherstellung der Datei /var/log/syslog abgeschlossen. Viele Anwendungen, insbesondere Protokolldateien und Datenbankdateien, können auf diese Weise wiederhergestellt werden.

helfen

Die Option -h gibt Hilfeinformationen zum Befehl lsof aus:

Ich schätze, diese Art von Hilfeinformationen kann Sie nur dazu zwingen, die Manpage zu lesen!

Zusammenfassen

lsof ist kein einfacher Befehl, wie Sie an der Länge der Manpage erkennen können. Wenn Sie mit der kleinen Demo beginnen, die in diesem Artikel vorgestellt wird, können Sie möglicherweise die umfangreiche Dokumentation vergessen, sie Schritt für Schritt verwenden und diesen Befehl schließlich beherrschen.

siehe:
lsof-Manpage
Detaillierte Erklärung des Linux-Befehls lsof
10 lsof-Befehlsbeispiele in Linux
Linux-LSOF-Befehls-Tutorial für Anfänger (10 Beispiele)
15 Linux-LSOF-Befehlsbeispiele (geöffnete Dateien identifizieren)

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Linux-Befehl „exa“ (bessere Dateianzeige als „ls“)
  • So sortieren Sie Dateien nach Datum mit dem Befehl ls in Linux
  • Tipps zum Auflisten von Dateien mit ls in der Linux-Befehlszeile
  • Detaillierte Erläuterung der ls-Befehlsparameter in Linux und Beispiele für die Verwendung des ls-Befehls
  • Tutorial zum Linux-Befehl „ls“ und Verwendung des Befehls „ls“
  • Detaillierte Erklärung und Beispiele für den Linux-Befehl lsof
  • Detaillierte Erklärung der Verwendung des Befehls ls in Linux
  • Detaillierte Erklärung des Linux-Befehls c emulation ls
  • Detaillierte Erklärung der Linux-Befehlsparameter ls
  • Verwendung des Linux-Befehls ls

<<:  Detaillierte Erklärung zu sinnvollen Einstellungen des MySQL sql_mode

>>:  Implementierungsbeispiel für die Datums- und Uhrzeitverarbeitung des WeChat-Applets wxs

Artikel empfehlen

Detaillierter Installationsprozess und Konfiguration von mysql5.7.19 zip

Offizielle Version von MySQL v5.7.19 (32/64-Bit-I...

Zusammenfassung des Linux-Befehls nc

Der vollständige Name von NC lautet Netcat (Netwo...

React realisiert sekundären Verknüpfungseffekt (Treppeneffekt)

In diesem Artikel wird der spezifische Code von R...

So ändern Sie den Bildlaufleistenstil in Vue

Inhaltsverzeichnis Zunächst müssen Sie wissen, da...

So zeichnen Sie in CocosCreator ein cooles Radardiagramm

Inhaltsverzeichnis Vorwort Vorschau Text Grafikko...

Abfrage der Daten des Tages vor dem aktuellen Zeitintervall in MySQL

1. Hintergrund In tatsächlichen Projekten stoßen ...

Verwendung des Node.js-HTTP-Moduls

Inhaltsverzeichnis Vorwort HTTP HTTP-Server Datei...

JavaScript implementiert die H5-Goldmünzenfunktion (Beispielcode)

Heute habe ich eine Aktivität für einen roten Ums...

Programme zum Abfragen und Löschen der Portnutzung im Windows-Betriebssystem

Im Windows-Betriebssystem das Programm zum Abfrag...