Ich denke, Sie haben sich irgendwann gefragt, ob es eine Möglichkeit gibt, geöffnete Dateien von einem Prozess oder einem Benutzer anzuzeigen. Das Gute daran ist, dass die Antwort auf diese Frage lsof command lautet.
Sie wissen wahrscheinlich bereits, dass der Befehl ls die Abkürzung für „Liste“ ist. lsof steht für „List Open Files“. Und genau das tut es, indem es geöffnete Dateien nach Prozessen, Benutzern und Prozess-IDs auflistet.
Lassen Sie mich Ihnen einige der häufigsten Verwendungen des Befehls lsof zeigen.
Beispiele für lsof-Befehle
Wenn Sie den Befehl lsof ohne Optionen und Argumente verwenden, listet er alle geöffneten Dateien von allen Prozessen im System auf.
lsof
Die Ausgabe sollte so aussehen:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,1 4096 2 /
systemd 1 root rtd DIR 252,1 4096 2 /
systemd 1 root txt REG 252,1 1595792 17384 /lib/systemd/systemd
systemd 1 root mem REG 252,1 1700792 2077 /lib/x86_64-linux-gnu/libm-2.27.so
Die Ausgabe ist größtenteils selbsterklärend, aber Sie fragen sich vielleicht immer noch über die Spalten FD und TYPE.
FD bedeutet Dateideskriptor. Einige der gebräuchlichen Werte für FD sind:
- cwd – Aktuelles Arbeitsverzeichnis
- txt – Textdateien
- mem – Memory Mapped File
- mmap – Speicherabgebildetes Gerät
- ZAHL – Der eigentliche Dateideskriptor. Es hat auch Informationen darüber, mit welcher Dateiberechtigung es geöffnet wird.
TYP ist ein Kinderspiel. Es gibt den Dateityp an. Hier sind einige Beispiele:
- REG – Normale Datei
- DIR – Verzeichnis
- CHR – Charakterspezifische Datei
- FIFO – Zuerst rein, zuerst raus
Vertrau mir. Sie möchten den Befehl lsof nicht ohne Argumente ausführen.
Warum sage ich das? Weil es Ihren Bildschirm mit Tausenden von Ergebnissen überschwemmen wird.
Wenn ich den Befehl lsof auf einem Ubuntu-Server ausführe und die Anzahl der Zeilen mit dem Befehl wc zähle, ist hier das Ergebnis.
lsof | wc -l
11432
Ja! Stimmt. Es gibt über elftausend Dateien, die von verschiedenen Prozessen im System geöffnet wurden.
Mach dir keine Sorgen. Der Befehl lsof ist beim Debuggen sehr hilfreich, da Sie sehen können, welche Prozesse welche Dateien öffnen und welche Datei von welchem Prozess geöffnet wird.
Wenn Sie nicht als root angemeldet sind, wäre die Ausgabe des Befehls lsof sehr begrenzt. Es ist eine gute Idee, sudo zu verwenden, wenn Sie als Nicht-Root-Benutzer angemeldet sind.
1. Alle Prozesse auflisten, die eine Datei geöffnet haben
Das ist einfach. Sie müssen nur den Pfad zu der Datei angeben.
lsof <path_to_file>
2. Alle vom Benutzer geöffneten Dateien auflisten
Dies ist in einer Umgebung mit mehreren Benutzern praktisch. Sie können alle von einem bestimmten Benutzer geöffneten Dateien folgendermaßen auflisten:
lsof -u <user_name>
Sie können auch mehr als einen Benutzer wie folgt angeben:
lsof -u user1, user2
oder so:
lsof -u user1 -u user2
3. Alle geöffneten Dateien in einem Verzeichnis auflisten
Wenn Sie sich fragen, welche der Dateien in einem bestimmten Verzeichnis geöffnet wurden, können Sie den Befehl lsof mit der Option +D verwenden.
lsof +D <path_to_directory>
Die Suche ist rekursiv. Es listet also alle geöffneten Dateien im erwähnten Verzeichnis und allen seinen Unterverzeichnissen auf.
4. Alle von einem Prozess geöffneten Dateien auflisten
In diesem Fall müssen Sie die Prozess-ID (PID) kennen. Wenn Sie die Prozess-ID kennen, können Sie die Option -p des Befehls lsof verwenden, um die von ihm geöffneten Dateien zu finden.
lsof -p <pid>
Sie können auch mehrere Prozess-IDs angeben.
lsof -p pid1, pid2, pid3
5. Alle Dateien auflisten, die durch einen Befehl geöffnet wurden
Dies ist besonders hilfreich beim Debuggen. Angenommen, Sie möchten sehen, welche Dateien vom http-Daemon verwendet werden, dann müssen Sie nur den Befehlsnamen angeben (in unserem Beispiel httpd).
lsof -c <command>
6. Finden Sie geöffnet von einem Benutzer und einem Befehl oder einem Prozess
Sie können Optionen wie Benutzer und Befehl und einen Prozess mit der Option –a kombinieren. Betrachten Sie es als den UND-Operator. Dies gibt Ihnen einen zusätzlichen Filter, während Sie versuchen, Ihre Suche einzugrenzen.
lsof -a -u user_name -c command_name
7. Netzwerkverbindungen und Ports mit dem Befehl lsof auflisten
Sie können auch den Befehl lsof verwenden, um offene Ports zu finden oder herauszufinden, welcher Prozess einen Port verwendet.
Sie können alle Arten von offenen Ports mit der Option -i archivieren:
lsof -i
Die Ausgabe kann wie folgt aussehen:
lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 920 root 3u IPv4 20507 0t0 TCP *:ssh (LISTEN)
sshd 920 root 4u IPv6 20535 0t0 TCP *:ssh (LISTEN)
docker-pr 1163 root 4u IPv6 21687 0t0 TCP *:https (LISTEN)
docker-pr 1175 root 4u IPv6 21717 0t0 TCP *:http (LISTEN)
sshd 7528 root 3u IPv4 39506588 0t0 TCP testing:ssh->212.91.91.19:58904 (ESTABLISHED)
systemd-r 10993 systemd-resolve 12u IPv4 20901990 0t0 UDP localhost:domain
systemd-r 10993 systemd-resolve 13u IPv4 20901991 0t0 TCP localhost:domain (LISTEN)
Sie können auch den Netzwerkverbindungstyp angeben. Um beispielsweise alle geöffneten TCP-Ports aufzulisten, können Sie Folgendes verwenden:
lsof -i tcp
Um herauszufinden, welcher Prozess einen bestimmten Port verwendet, können Sie die Portnummer angeben:
lsof -i :<port_number>
Bonus-Tipp:Verwendung des Negationsoperators mit lsof
Sie können den Negationsoperator verwenden, um einen Benutzer oder Prozess auszuschließen, während Sie den Befehl lsof verwenden.
Wenn Sie beispielsweise alle Dateien auflisten möchten, die von einem anderen Benutzer als root geöffnet wurden, verwenden Sie dies folgendermaßen:
lsof -u ^root
Der Befehl lsof wird noch nützlicher, wenn Sie ihn mit dem Befehl grep verwenden.
Ich hoffe, Sie haben mit diesem Artikel etwas Neues gelernt. Wenn Sie Fragen oder Anregungen haben, hinterlassen Sie bitte unten einen Kommentar.