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 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 Nachfolgend finden Sie eine kurze Einführung in die gemeinsamen Inhalte der Spalten FD und TYPE. 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. 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. $ 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: 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. $ 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: 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: 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:
|
<<: Detaillierte Erklärung zu sinnvollen Einstellungen des MySQL sql_mode
>>: Implementierungsbeispiel für die Datums- und Uhrzeitverarbeitung des WeChat-Applets wxs
Offizielle Version von MySQL v5.7.19 (32/64-Bit-I...
Hintergrund: Tablespace: Alle INNODB-Daten werden...
Ich glaube, dass jeder MySQL aus verschiedenen Gr...
Der vollständige Name von NC lautet Netcat (Netwo...
Mit der kontinuierlichen Entwicklung der Internetw...
In diesem Artikel wird der spezifische Code von R...
Inhaltsverzeichnis Zunächst müssen Sie wissen, da...
Inhaltsverzeichnis Vorwort Vorschau Text Grafikko...
1. Hintergrund In tatsächlichen Projekten stoßen ...
Inhaltsverzeichnis Array-Deduplizierung 1 Doppels...
Inhaltsverzeichnis Vorwort HTTP HTTP-Server Datei...
Verwenden Sie ifnull statt isnull isnull wird ver...
Heute habe ich eine Aktivität für einen roten Ums...
Im Windows-Betriebssystem das Programm zum Abfrag...
Als Front-End-Webentwickler sind Sie beim Erstell...