Der Befehl lsof listet geöffnete Dateien, Sockets und Pipes auf. Sie können den Befehl lsof verwenden, um zu sehen, welche Dateien offen gehalten werden (z. B. Bibliotheken oder Protokolldateien) und auf welche Ports Daemons hören. Sie können mit dem Befehl lsof nach geöffneten Dateien suchen. lsof sollte als Superuser (root) ausgeführt werden, um alle geöffneten Dateien zu sehen. Wenn es ohne Argumente/Optionen verwendet wird, listet lsof alle offenen Dateien für die derzeit aktiven Prozesse auf.
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 150352 4587561 /sbin/init (deleted) init 1 root DEL REG 253,0 4849693 /lib64/libnss_files-2.12.so ..........
Ausgabe des „lsof“-Befehls verstehen:
COMMAND: Command using the file. PID: PID of the file USER: Owner of the file FD: File descriptor. Different flags of File descriptor are as below: # : The number in front of flag(s) is the file descriptor number used by the process to associate with the file u : File open with Read and Write permission r : File open with Read permission w : File open with Write permission W : File open with Write permission and with Write Lock on entire file mem : Memory mapped file, usually for shared library TYPE: File type. Different flags of File type are as below: REG - Regular file DIR - Directory DEVICE: major, minor number of the device where file resides. SIZE/OFF: File size NODE: inode number NAME: File name
Geöffnete Dateien unter einem Einhängepunkt finden
Geöffnete Dateien in einem bestimmten Verzeichnis können mit lsof gefunden werden. Öffnen Sie zum Beispiel eine Textdatei (nicht schließen – offen lassen) in einem Verzeichnis zum Bearbeiten mit vi und überprüfen Sie die lsof-Ausgabe in diesem Verzeichnis in einer anderen Sitzung.
# cd /test # vi a.txt
Suchen Sie in einer anderen Sitzung nach der lsof-Ausgabe in diesem Verzeichnis:
# lsof /test COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2972 root cwd DIR 253,0 4096 262145 /test vi 3012 root cwd DIR 253,0 4096 262145 /test
Dies kann auch verwendet werden, um den beschäftigten Einhängepunkt auszuhängen. Prozesse, die den Einhängepunkt beschäftigt halten, können mit lsof.
gefunden werdenInformationen zu bestimmten Prozessen suchen
Verwenden Sie für weitere Informationen zu einem bestimmten Prozess die Option -p für lsof:
# lsof -p 8797
Zuhöradressen anzeigen
Daemons können sich entweder an die globale IPv4-Adresse 0.0.0.0 oder an bestimmte Adressen wie 127.0.0.1 (localhost) binden. Ein an die localhost-Adresse gebundener Daemon ist nur vom System selbst aus erreichbar. Verwenden Sie die Optionen -i und -nP für lsof, um Listening-Ports ohne Suchen nach Hostnamen und Diensten anzuzeigen. Das folgende Beispiel zeigt den Apache httpd-Daemon, der auf localhost am nicht standardmäßigen Port 7777 ausgeführt wird. Andere Systeme können sich nicht mit diesen httpd-Prozessen verbinden:gut für die Sicherheit, schlecht für die Remote-Konnektivität.
Beispiel:
# lsof -i -nP | grep httpd httpd 8616 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN) httpd 8614 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN) httpd 8623 apache 16u IPv4 0x0455567fh 0t0 TCP 127.0.0.1:7777 (LISTEN)
Beispiel:
Im Gegensatz dazu akzeptiert der folgende OpenSSH-sshd-Prozess Verbindungen von anderen Systemen, da er an die Adresse 0.0.0.0 gebunden ist, was durch das * vor der Portnummer angezeigt wird.
# lsof -i -P | grep sshd sshd 4341 root 3u IPv4 46438 TCP *:22 (LISTEN)
Bestimmte Anwendungen lauschen auf vielen verschiedenen Ports, wie z. B. der Berkeley Internet Name Daemon (BIND) namens Daemon, Version 9.
Beispiel:
# lsof -i -nP | grep ^named named 9865 named 5u IPv6 0x03348be0 0t0 UDP *:53 named 9865 named 6u IPv6 0x0566re80 0t0 TCP *:53 (LISTEN) named 9865 named 7u IPv4 0x03456b10 0t0 UDP 127.0.0.1:53 named 9865 named 8u IPv4 0x01870570 0t0 TCP 127.0.0.1:53 (LISTEN) named 9865 named 9u IPv4 0x03456a40 0t0 UDP *:49164 named 9865 named 10u IPv6 0x03456970 0t0 UDP *:49165 named 8888 named 11u IPv4 0x0186fd54 0t0 TCP *:953 (LISTEN) named 8888 named 13u IPv4 0x01387ee0 0t0 UDP 168.1.863.1:67 named 8888 named 14u IPv4 0x099899ce4 0t0 TCP 168.1.863.1:67(LISTEN)
Dateien finden, die von einem Prozess geöffnet wurden
Ein Prozess funktioniert möglicherweise aus anderen Gründen nicht, z. B. einer Firewall, einer Zugriffsdienststeuerung wie tcp_wrappers oder einer anderen Fehlkonfiguration. Verwenden Sie ping, telnet oder nmap, um von einem entfernten System aus zu überprüfen, ob möglicherweise etwas anderes die Anfrage blockiert, oder führen Sie tcpdump aus, um zu sehen, ob Verbindungen das Quellsystem verlassen oder das Zielsystem erreichen.
Beispiel
Um zu sehen, welche Dateien von Prozessen geöffnet werden, deren Namen mit „t“ (telnetd…) und bash beginnen. Und um zu sehen, welche Dateien von init geöffnet werden, verwenden Sie die folgenden Befehle:
# lsof -c t # lsof -c bash # lsof -c init
Beispiel
Um zu sehen, welche Dateien von Prozessen geöffnet werden, deren Namen mit „testuser“ beginnen, aber diejenigen auszuschließen, deren Eigentümer der Benutzer „tom“ ist, verwenden Sie den folgenden Befehl:
# lsof -c testuser -u ^tom
Von Benutzern geöffnete Prozesse finden
Um zu sehen, welche Prozesse von den Benutzern myuser und tom geöffnet werden, verwenden Sie den folgenden Befehl:
# lsof -u myuser,tom
Durch Prozess verwendeten Port finden
Verwenden Sie den folgenden Befehl, um zu sehen, welche Prozesse einen bestimmten Port verwenden:
# lsof -i TCP:389
Wie finde ich die Anzahl offener Dateien für einen Prozessnamen und Prozess-PID, sortiert nach Anzahl offener Dateien?
Dies kann interessant sein, wenn der Fehler „zu viele offene Dateien“ auftritt. Verwenden Sie das folgende Skript, das den Befehl lsof verwendet:
# lsof | perl -lane '$x{"$F[0]:$F[1]"}++;END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
Prozesse mit Max File Descriptors finden
Grenzwerte für Dateideskriptoren können mit dem folgenden Befehl für eine Shell gesetzt werden:
# ulimit -n 65536
Verwenden Sie den Befehl „lsof“, um herauszufinden, was die Dateideskriptoren auf dem System verwendet.
# lsof -g | awk '{print $2}' | sort -u > /tmp/lsof_sort.txt
# for var in `cat /tmp/lsof_sort.txt` do echo `echo "$var ---- "``grep -x $var /tmp/lsof.txt | wc -l` done
Dadurch werden alle Prozesse und die entsprechende Anzahl der von ihnen geöffneten Dateien aufgelistet. Sie können die Prozesse mit den meisten geöffneten Dateien auswählen und sehen, welche das sind.