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:
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:
Wenn Sie daher die mit einer bestimmten IP-Adresse hergestellte Verbindung anzeigen müssen, können Sie die folgende Methode verwenden: $ lsof [email protected] 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.
Das könnte Sie auch interessieren:
|
<<: So führen Sie das React-Projekt auf dem offiziellen WeChat-Konto aus
>>: Eine kurze Analyse des Kimono-Memo-Problems
Wenn wir ein SVG-Bild zur Anzeige hinzufügen, erh...
1. Installieren Sie die vsftpd-Komponente Install...
Offizielle Website: http://code.google.com/p/zen-c...
Installieren Sie mysql5.7.21 in der Fensterumgebu...
1. Ich habe vor kurzem eine neue Version von Ubun...
In JavaScript können drei Arten von Meldungsfelde...
Gute Datenbankspezifikationen tragen dazu bei, di...
Dabei wird das Bild als Hintergrund verwendet und...
Tag-Typ (Anzeigemodus) HTML-Tags werden im Allgem...
Inhaltsverzeichnis Effektanzeige Code-Link Schlüs...
Ich habe vor Kurzem jemandem bei einem Projekt ge...
Vorwort Unabhängig davon, ob es sich um Oracle od...
1. Die blaue Farbe des Tags wird aufgehoben, wenn...
Kürzlich habe ich die Funktion zum Umbenennen ges...
Die offizielle Version 8.0.11 von MySQL 8 wurde v...