lsof steht für List Open Files.
An den Befehl lsof kann man sich leicht erinnern, wenn man ihn sich als „ls + of“ vorstellt, wobei ls für Liste und of für geöffnete Dateien steht.
Es ist ein Befehlszeilenprogramm, das verwendet wird, um die Informationen über die Dateien aufzulisten, die von verschiedenen Prozessen geöffnet werden. In Unix ist alles eine Datei (Pipes, Sockets, Verzeichnisse, Geräte usw.). Wenn Sie also lsof verwenden, können Sie Informationen über alle geöffneten Dateien abrufen.
1. Einführung in lsof
Wenn Sie einfach lsof eingeben, erhalten Sie eine Liste aller geöffneten Dateien, die zu allen aktiven Prozessen gehören.
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root 0u CHR 1,3 0t0 4369 /dev/null init 1 root 1u CHR 1,3 0t0 4369 /dev/null init 1 root 2u CHR 1,3 0t0 4369 /dev/null init 1 root 3r FIFO 0,8 0t0 6323 pipe ...
Standardmäßig wird eine Datei pro Zeile angezeigt. Die meisten Spalten sind selbsterklärend. Wir erklären die Details einiger kryptischer Spalten (FD und TYPE).
FD – Repräsentiert den Dateideskriptor. Einige der Werte von FDs sind,
- cwd – Aktuelles Arbeitsverzeichnis
- txt – Textdatei
- mem – Memory Mapped File
- mmap – Speicherabgebildetes Gerät
- ZAHL – Stellt den tatsächlichen Dateideskriptor dar. Das Zeichen nach der Zahl, z. B. „1u“, stellt den Modus dar, in dem die Datei geöffnet wird. r für Lesen, w für Schreiben, u für Lesen und Schreiben.
TYP – Gibt den Typ der Datei an. Einige der Werte von TYPEs sind,
- REG – Normale Datei
- DIR – Verzeichnis
- FIFO – Zuerst rein, zuerst raus
- CHR – Charakterspezifische Datei
Eine vollständige Liste von FD &TYPE finden Sie unter man lsof.
2. Prozesse auflisten, die eine bestimmte Datei geöffnet haben
Sie können nur die Prozesse auflisten, die eine bestimmte Datei geöffnet haben, indem Sie den Dateinamen als Argument angeben.
# lsof /var/log/syslog COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog
3. Geöffnete Dateien unter einem Verzeichnis auflisten
Mit der Option „+D“ können Sie die Prozesse auflisten, die Dateien in einem bestimmten Verzeichnis geöffnet haben. +D rekursiert auch die Unterverzeichnisse. Wenn Sie nicht möchten, dass lsof rekursiv wird, verwenden Sie die Option „+d“.
# lsof +D /var/log/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/history
4. Listen Sie geöffnete Dateien basierend auf Prozessnamen auf, die mit
beginnenSie können die geöffneten Dateien nach Prozessnamen auflisten, die mit einer Zeichenfolge beginnen, indem Sie die Option „-c“ verwenden. -c gefolgt vom Prozessnamen listet die Dateien auf, die von dem Prozess geöffnet wurden, beginnend mit diesem Prozessnamen. Sie können mehrere Schalter -c in einer einzigen Befehlszeile eingeben.
# lsof -c ssh -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so ... ssh-agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ssh-sUymKXxw1495/agent.1495
5. Listen Sie Prozesse auf, die einen Einhängepunkt verwenden
Manchmal, wenn wir versuchen, ein Verzeichnis auszuhängen, zeigt das System den Fehler „Gerät oder Ressource ausgelastet“ an. Wir müssen also herausfinden, welche Prozesse den Einhängepunkt verwenden, und diese Prozesse beenden, um das Verzeichnis auszuhängen. Mit lsof können wir diese Prozesse finden.
# lsof /home
Folgendes wird auch funktionieren.
# lsof +D /home/
6. Dateien auflisten, die von einem bestimmten Benutzer geöffnet wurden
Um die Liste der von einem bestimmten Benutzer geöffneten Dateien zu finden, verwenden Sie die Option „-u“.
# lsof -u lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME update-no 1892 lakshmanan 20r FIFO 0,8 0t0 14536 pipe update-no 1892 lakshmanan 21w FIFO 0,8 0t0 14536 pipe bash 1995 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan
Manchmal möchten Sie vielleicht Dateien auflisten, die von allen Benutzern geöffnet wurden, erwarten Sie einige 1 oder 2. In diesem Fall können Sie das „^“ verwenden, um nur den bestimmten Benutzer wie folgt auszuschließen
# lsof -u ^lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rtkit-dae 1380 rtkit 7u 0000 0,9 0 4360 anon_inode udisks-da 1584 root cwd DIR 8,1 4096 2 /
Der obige Befehl listet alle Dateien auf, die von allen Benutzern geöffnet wurden, außer dem Benutzer „lakshmanan“.
7. Alle geöffneten Dateien eines bestimmten Prozesses auflisten
Sie können alle Dateien auflisten, die von einem bestimmten Prozess mit der Option „-p“ geöffnet wurden. Manchmal ist es hilfreich, weitere Informationen zu einem bestimmten Prozess zu erhalten.
# lsof -p 1753 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1753 lakshmanan cwd DIR 8,1 4096 393571 /home/lakshmanan/test.txt bash 1753 lakshmanan rtd DIR 8,1 4096 2 / bash 1753 lakshmanan 255u CHR 136,0 0t0 3 /dev/pts/0 ...
8. Beenden Sie alle Prozesse, die zu einem bestimmten Benutzer gehören
Wenn Sie alle Prozesse beenden möchten, deren Dateien von einem bestimmten Benutzer geöffnet wurden, können Sie die Option „-t“ verwenden, um nur die Prozess-ID des Prozesses auszugeben, und sie wie folgt zum Beenden übergeben
# kill -9 `lsof -t -u lakshmanan`
Der obige Befehl beendet alle Prozesse, die dem Benutzer „lakshmanan“ gehören, der Dateien geöffnet hat.
Ebenso können Sie „-t“ auf viele Arten verwenden. Um beispielsweise die Prozess-ID eines Prozesses aufzulisten, der /var/log/syslog geöffnet hat, kann dies mit
erfolgen# lsof -t /var/log/syslog 489
Apropos beenden, wussten Sie, dass es 4 Möglichkeiten gibt, einen Prozess zu beenden?
9. Kombinieren Sie weitere Listenoptionen mit OR/AND
Wenn Sie mehr als eine Listenoption in lsof verwenden, werden diese standardmäßig ODER-verknüpft. Zum Beispiel
# lsof -u lakshmanan -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init bash 1995 lakshmanan 2u CHR 136,2 0t0 5 /dev/pts/2 bash 1995 lakshmanan 255u CHR 136,2 0t0 5 /dev/pts/2 ...
Der obige Befehl verwendet zwei Listenoptionen, ‚-u‘ und ‚-c‘. Der Befehl listet also den Prozess auf, der dem Benutzer „lakshmanan“ gehört, und der Prozessname beginnt mit „init“.
Aber wenn Sie einen Prozess auflisten möchten, der dem Benutzer „lakshmanan“ gehört und der Prozessname mit „init“ beginnt, können Sie die Option „-a“ verwenden.
# lsof -u lakshmanan -c init -a
Der obige Befehl gibt nichts aus, da es keinen solchen Prozess namens „init“ gibt, der dem Benutzer „lakshmanan“ gehört.
10. Führe lsof im Wiederholungsmodus aus
lsof unterstützt auch den Wiederholungsmodus. Es listet zuerst Dateien basierend auf den angegebenen Parametern auf und verzögert für bestimmte Sekunden und listet erneut Dateien basierend auf den angegebenen Parametern auf. Er kann durch ein Signal unterbrochen werden.
Der Wiederholungsmodus kann mit „-r“ oder „+r“ aktiviert werden. Wenn dann „+r“ verwendet wird, endet der Wiederholungsmodus, wenn keine geöffneten Dateien gefunden werden. ‚-r‘ wird weiter auflisten, verzögern, auflisten, bis ein Interrupt gegeben wird, unabhängig davon, ob Dateien geöffnet sind oder nicht.
Jede Zyklusausgabe wird durch „=======“ getrennt. Sie geben auch die Zeitverzögerung als "-r" | an ‘+r’.
# lsof -u lakshmanan -c init -a -r5 ======= ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME inita.sh 2971 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan inita.sh 2971 lakshmanan rtd DIR 8,1 4096 2 / inita.sh 2971 lakshmanan txt REG 8,1 83848 524315 /bin/dash inita.sh 2971 lakshmanan mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so inita.sh 2971 lakshmanan mem REG 8,1 117960 1442612 /lib/i386-linux-gnu/ld-2.13.so inita.sh 2971 lakshmanan 0u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 1u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 2u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 10r REG 8,1 20 393578 /home/lakshmanan/inita.sh =======
In der obigen Ausgabe gibt es für die ersten 5 Sekunden keine Ausgabe. Danach wird ein Skript namens „inita.sh“ gestartet, das die Ausgabe auflistet.
Netzwerkverbindung finden
Auch Netzwerkverbindungen sind Dateien. So können wir Informationen über sie finden, indem wir lsof verwenden.
11. Alle Netzwerkverbindungen auflisten
Sie können alle geöffneten Netzwerkverbindungen auflisten, indem Sie die Option „-i“ verwenden.
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 515 avahi 13u IPv4 6848 0t0 UDP *:mdns avahi-dae 515 avahi 16u IPv6 6851 0t0 UDP *:52060 cupsd 1075 root 5u IPv6 22512 0t0 TCP ip6-localhost:ipp (LISTEN)
Sie können auch „-i4“ oder „-i6“ verwenden, um nur „IPV4“ bzw. „IPV6“ aufzulisten.
12. Alle Netzwerkdateien auflisten, die von einem bestimmten Prozess verwendet werden
Sie können alle Netzwerkdateien, die von einem Prozess verwendet werden, wie folgt auflisten
# lsof -i -a -p 234
Sie können auch Folgendes verwenden
# lsof -i -a -c ssh
Der obige Befehl listet die Netzwerkdateien auf, die von den Prozessen geöffnet werden, beginnend mit ssh.
13. Prozesse auflisten, die auf einem bestimmten Port lauschen
Sie können die Prozesse auflisten, die auf einem bestimmten Port lauschen, indem Sie wie folgt „-i“ mit „:“ verwenden
# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME exim4 2541 Debian-exim 3u IPv4 8677 TCP localhost:smtp (LISTEN)
14. Alle TCP- oder UDP-Verbindungen auflisten
Sie können alle TCP- oder UDP-Verbindungen auflisten, indem Sie das Protokoll mit „-i“ angeben.
# lsof -i tcp; lsof -i udp;
15. Alle NFS-Dateien (Network File System) auflisten
Sie können alle NFS-Dateien auflisten, indem Sie die Option „-N“ verwenden. Der folgende lsof-Befehl listet alle NFS-Dateien auf, die vom Benutzer „lakshmanan“ verwendet werden.
# lsof -N -u lakshmanan -a