Linux verwendet den Befehl lsof, um den Status des Dateiöffnens zu überprüfen

Linux verwendet den Befehl lsof, um den Status des Dateiöffnens zu überprüfen

Vorwort

Wir alle wissen, dass unter Linux „alles eine Datei ist“, deshalb ist es manchmal besonders wichtig, den Öffnungsstatus von Dateien zu überprüfen. Hier ist ein Befehl, der uns in dieser Angelegenheit gut helfen kann – es ist lsof.

Welche Dateien gibt es unter Linux

Bevor wir den Befehl lsof vorstellen, sprechen wir kurz über die Hauptdateien in Linux:

  • Normale Dateien
  • Inhaltsverzeichnis
  • Symbolische Links
  • Blockorientierte Gerätedateien
  • Zeichenorientierte Gerätedateien
  • Pipes und benannte Pipes
  • Steckdosen

Die oben genannten Dateitypen werden nicht im Detail vorgestellt.

Einführung in die praktische Verwendung des Befehls lsof

lsof ist die Abkürzung für „List Open Files“. Es verfügt über viele Parameter, wir stellen hier jedoch nur einige praktische Anwendungsgebiete vor (beachten Sie, dass in manchen Fällen zur Ausführung Root-Rechte erforderlich sind).

Alle aktuell geöffneten Dateien anzeigen

Im Allgemeinen führt die direkte Eingabe des Befehls „lsof“ zu vielen Ergebnissen und es kann schwierig sein, die benötigten Informationen zu finden. Lassen Sie mich diese Gelegenheit jedoch nutzen, um zu erklären, welche Informationen ein Datensatz enthält.

$ lsof (wählen Sie hier einen Datensatz zur Anzeige aus)
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/AUS KNOTENNAME
vi 27940 hyb 7u REG 8,15 16384 137573 /home/hyb/.1.txt.swp

Die von lsof angezeigten Ergebnisse stellen von links nach rechts dar: den Namen des Programms, das die Datei öffnet, die Prozess-ID, den Benutzer, den Dateideskriptor, den Dateityp, das Gerät, die Größe, die iNode-Nummer und den Dateinamen.

Konzentrieren wir uns auf die Spalten, die wir derzeit kennen. Dieser Datensatz zeigt an, dass das vi-Programm mit der Prozess-ID 27940 die reguläre Datei (REG regular file).1.txt.swap im Verzeichnis /home/hyb mit einem Dateibeschreibungswert von 7 geöffnet hat und sich im Lese-/Schreibstatus befindet. Die aktuelle Größe beträgt 16384 Bytes.

Liste gelöschter Dateien, die Speicherplatz belegen

In einer Produktionsumgebung können wir mit dem Befehl df feststellen, dass der Speicherplatz voll ist, aber es ist tatsächlich schwierig, die Datei zu finden, die den Speicherplatz füllt. Dies liegt häufig daran, dass eine große Datei gelöscht wurde, aber von einem Prozess geöffnet wird, sodass ihre Spur nicht mit normalen Mitteln gefunden werden kann, am häufigsten mit Protokolldateien. Wir können solche Dateien über lsof finden:

$ lsof |grep gelöscht
Xorg 1131 root 125u REG 0,5 4 61026 /memfd:xshmfence (gelöscht)
Xorg 1131 root 126u REG 0,5 4 62913 /memfd:xshmfence (gelöscht)
Xorg 1131 root 129u REG 0,5 4 74609 /memfd:xshmfence (gelöscht)

Sie können sehen, dass diese gelöschten, aber noch geöffneten Dateien als gelöscht markiert werden, wenn sie schließlich gefunden werden. Zu diesem Zeitpunkt können Sie entsprechend der tatsächlichen Situation analysieren, welche Dateien möglicherweise zu groß sind, aber gelöscht wurden, sodass der Speicherplatz immer noch voll ist.

Wiederherstellen einer geöffneten, aber gelöschten Datei

Früher konnten wir gelöschte, aber noch geöffnete Dateien finden. Tatsächlich waren die Dateien nicht wirklich weg. Wenn sie versehentlich gelöscht wurden, gibt es immer noch Möglichkeiten, sie wiederherzustellen. Am Beispiel der Datei /var/log/syslog löschen wir diese zunächst (Root-Benutzer):

$ rm /var/log/syslog

Verwenden Sie dann lsof, um zu sehen, welcher Prozess die Datei geöffnet hat:

$ lsof |grep syslog
rs:main 993 1119 syslog 5w REG 8,10 78419 528470 /var/log/syslog (gelöscht)

Wir können feststellen, dass der Prozess mit der Prozess-ID 993 die Datei geöffnet hat. Wir wissen, dass jeder Prozess einen Eintrag zum Öffnen des Dateideskriptors unter /proc hat:

$ ls -l /proc/993/fd
lr-x------ 1 root root 64 5. März 18:30 0 -> /dev/null
l-wx------ 1 root root 64 5. März 18:30 1 -> /dev/null
l-wx------ 1 root root 64 5. März 18:30 2 -> /dev/null
lrwx------ 1 root root 64 5. März 18:30 3 -> Socket:[15032]
lr-x------ 1 root root 64 5. März 18:30 4 -> /proc/kmsg
l-wx------ 1 root root 64 5. März 18:30 5 -> /var/log/syslog (gelöscht)
l-wx------ 1 root root 64 5. März 18:30 6 -> /var/log/auth.log

Hier finden wir die gelöschte Syslog-Datei, der Dateideskriptor ist 5, wir leiten sie weiter:

$ cat /proc/993/fd/5 > syslog
$ ls -al /var/log/syslog
-rw-r--r-- 1 root root 78493 5. März 19:22 /var/log/syslog

Auf diese Weise haben wir die Syslog-Datei wiederhergestellt.

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

Unter Windows kommt es häufig vor, dass Sie eine Datei löschen möchten und dann die Meldung erhalten, dass sie von einem anderen Programm verwendet wird. Dabei wird Ihnen jedoch nicht mitgeteilt, um welches Programm es sich handelt. Wir können im Ressourcenmanager-Leistung-Ressourcenmonitor-CPU-zugehörigen Handle nach Dateien suchen, um das Programm zu finden, das die Datei öffnet, aber die Suchgeschwindigkeit ist langsam.

Linux ist relativ einfach, verwenden Sie einfach den Befehl lsof. Um beispielsweise zu sehen, welche Programme derzeit hello.c öffnen:

$ lsof hallo.c
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/AUS KNOTENNAME
Schwanz 28731 hyb 3r REG 8,15 228 138441 hallo.c

Wir werden jedoch feststellen, dass das mit vi geöffnete „hello.c“ nicht gefunden wird. Dies liegt daran, dass vi eine temporäre Kopie öffnet. Lassen Sie uns anders suchen:

$ lsof |grep hallo.c
Schwanz 28906 hyb 3r REG 8,15 228 138441 /home/hyb/workspaces/c/hello.c
vi 28933 hyb 9u REG 8,15 12288 137573 /home/hyb/workspaces/c/.hello.c.swp

Auf diese Weise haben wir zwei Programme gefunden, die mit der Datei hello.c in Zusammenhang stehen.

Die Rolle von grep besteht hier darin, aus allen Ergebnissen nur die Ergebnisse aufzulisten, die die Bedingungen erfüllen.

Überprüfen, ob eine Verzeichnisdatei geöffnet ist

$ lsof +D ./

Überprüfen Sie, welche Dateien vom aktuellen Prozess geöffnet werden

Verwendung: lsof -c Prozessname

Es wird normalerweise verwendet, um Programmprobleme zu lokalisieren, beispielsweise um zu sehen, welche Bibliotheken der aktuelle Prozess verwendet, welche Dateien geöffnet sind usw. Angenommen, es gibt ein Hallo-Programm, das Zeichen in einer Schleife druckt:

$ lsof -c hallo
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/AUS KNOTENNAME
hallo 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c
hallo 29190 hyb rtd DIR 8,10 4096 2 /
hallo 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hallo
hallo 29190 hyb mem REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so
hallo 29190 hyb mem REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so
hallo 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20
hallo 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20
hallo 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20

Daraus können wir ersehen, dass zumindest /lib/x86_64-linux-gnu/libc-2.23.so und die Hello-Datei verwendet werden.

Sie können es auch nach Prozess-ID anzeigen und mehrere durch Kommas getrennte Prozess-IDs verwenden:

$ lsof -p 29190
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/AUS KNOTENNAME
hallo 29190 hyb cwd DIR 8,15 4096 134538 /home/hyb/workspaces/c
hallo 29190 hyb rtd DIR 8,10 4096 2 /
hallo 29190 hyb txt REG 8,15 9816 138314 /home/hyb/workspaces/c/hallo
hallo 29190 hyb mem REG 8,10 1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so
hallo 29190 hyb mem REG 8,10 162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so
hallo 29190 hyb 0u CHR 136,20 0t0 23 /dev/pts/20
hallo 29190 hyb 1u CHR 136,20 0t0 23 /dev/pts/20
hallo 29190 hyb 2u CHR 136,20 0t0 23 /dev/pts/20

Natürlich gibt es auch eine andere Möglichkeit: Verwenden Sie das Proc-Dateisystem, um zunächst die Prozess-ID des Hello-Prozesses zu ermitteln:

$ ps -ef | grep hallo
hyb 29190 27929 0 21:14 pts/20 00:00:00 ./hallo 2
hyb 29296 28848 0 21:18 pts/22 00:00:00 grep --color=auto hallo

Sie können sehen, dass die Prozess-ID 29190 ist, und das Verzeichnis der Prozessdateibeschreibungsdatensätze überprüfen:

$ ls -l /proc/29190/fd
lrwx------ 1 hyb hyb 64 2. März 21:14 0 -> /dev/pts/20
lrwx------ 1 hyb hyb 64 2. März 21:14 1 -> /dev/pts/20
lrwx------ 1 hyb hyb 64 2. März 21:14 2 -> /dev/pts/20

Diese Methode kann viele Informationen filtern, da sie nur auflistet, was der Prozess tatsächlich geöffnet hat. Hier öffnet sie nur 0, 1 und 2, nämlich Standardeingabe, Standardausgabe und Standardfehler.

Prüfen, ob ein Port belegt ist

Bei der Nutzung einer Datenbank oder beim Aktivieren eines Webdienstes tritt immer das Problem der Portbelegung auf. Wie prüfen Sie also, ob ein Port belegt ist?

$ lsof -i :6379
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/AUS KNOTENNAME
redis-ser 29389 hyb 6u IPv6 534612 0t0 TCP *:6379 (HÖREN)
redis-ser 29389 hyb 7u IPv4 534613 0t0 TCP *:6379 (HÖREN)

Hier sieht man, dass der Redis-Ser-Prozess den Port 6379 belegt.

Alle TCP/UDP-Verbindungen anzeigen

$ lsof -i tcp
ava 2534 hyb 6u IPv6 31275 0t0 TCP localhost:9614 (HÖREN)
java 2534 hyb 22u IPv6 96922 0t0 TCP localhost:9614->localhost:39004 (HERGESTELLT)
java 2534 hyb 23u IPv6 249588 0t0 TCP localhost:9614->localhost:45460 (HERGESTELLT)

Natürlich können wir auch den Befehl netstat verwenden.

$ netstat -anp | grep 6379

Auf den Parameter -i können hier mehrere Bedingungen folgen:

  • -i 4 #IPv4-Adresse
  • -i 6 #IPv6-Adresse
  • -i tcp #TCP-Verbindung
  • -i :3306 #Anschluss
  • -i @ip #IP-Adresse

Wenn Sie daher die mit einer bestimmten IP-Adresse hergestellte Verbindung anzeigen müssen, können Sie die folgende Methode verwenden:

Sehen Sie, welche Dateien ein Benutzer geöffnet hat

Linux ist ein Mehrbenutzer-Betriebssystem. Woher wissen Sie, welche Dateien von anderen normalen Benutzern geöffnet werden? Sie können den Parameter -u verwenden

$ lsof -u hyb
(Zu viel Inhalt, weggelassen)

Listet alle geöffneten Dateien auf, mit Ausnahme eines bestimmten Prozesses oder eines bestimmten Benutzers

Tatsächlich ähnelt es der vorherigen Verwendung, außer dass ^ vor der Prozess-ID oder dem Benutzernamen hinzugefügt wird, zum Beispiel:

lsof -p ^1 #Listet alle geöffneten Dateien auf, außer dem Prozess mit der Prozess-ID 1 lsof -u ^root #Listet alle geöffneten Dateien auf, außer dem Root-Benutzer

Zusammenfassen

Die obige Einführung basiert auf einer Bedingung. Tatsächlich können mehrere Bedingungen kombiniert werden. Um beispielsweise die TCP-Socket-Dateien aufzulisten, die vom Prozess mit der Prozess-ID 1 geöffnet wurden:

lsof -p 1 -i tcp

Es gibt viele lsof-Parameter und Sie können den Befehl „man“ verwenden, um die spezifischen Parameter anzuzeigen. Für uns ist es jedoch ausreichend, diese praktischen Grundlagen zu kennen.

Nun, das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Autor dieses Artikels: Sehen Sie sich diesen Artikellink an: https://www.yanbinghu.com/2019/03/05/61180.html
Copyright-Erklärung: Bei diesem Artikel handelt es sich um einen Originalartikel. Das Copyright liegt bei Shouwang und er unterliegt der Lizenzvereinbarung CC BY-NC-SA 3.0. Bei Nachdruck bitte bei mir melden!

Das könnte Sie auch interessieren:
  • So zeigen Sie die Erstellungszeit von Dateien in Linux an
  • Verwenden Sie die Befehle more, less und cat in Linux, um Dateiinhalte anzuzeigen
  • Detaillierte Beispiele zum Anzeigen von Dateiattributen in Linux (ls, lsattr, file, stat)
  • So zeigen Sie Ordnergrößen an und sortieren nach Größe in Linux
  • Eine einfache Möglichkeit, die Dateisystemblockgröße und die Speicherseitengröße in Linux anzuzeigen
  • Linux-Befehl „du“ zum Anzeigen von Ordnergrößen und Sortieren in absteigender Reihenfolge
  • Detaillierte Erklärung der Befehle zum Anzeigen von Linux-Dateien

<<:  So führen Sie das React-Projekt auf dem offiziellen WeChat-Konto aus

>>:  Eine kurze Analyse des Kimono-Memo-Problems

Artikel    

Artikel empfehlen

Detaillierte Erläuterung der FTP-Umgebungskonfigurationslösung (vsftpd)

1. Installieren Sie die vsftpd-Komponente Install...

Verbesserung der Aktualisierungsfunktion für Zen-Codierungsressourcen

Offizielle Website: http://code.google.com/p/zen-c...

Beispiel für ein JavaScript-Meldungsfeld

In JavaScript können drei Arten von Meldungsfelde...

Die Eisernen Gesetze der MySQL-Datenbank (Zusammenfassung)

Gute Datenbankspezifikationen tragen dazu bei, di...

Gründe, warum MySQL 8.0-Statistiken ungenau sind

Vorwort Unabhängig davon, ob es sich um Oracle od...

So löschen Sie die Hintergrundfarbe des A-Tags, wenn in H5 darauf geklickt wird

1. Die blaue Farbe des Tags wird aufgehoben, wenn...

Detaillierte Erklärung einer Methode zum Umbenennen von Prozeduren in MySQL

Kürzlich habe ich die Funktion zum Umbenennen ges...

So installieren und implementieren Sie MySQL 8.0 unter CentOS8

Die offizielle Version 8.0.11 von MySQL 8 wurde v...