lsof ist ein leistungsfähiges Dienstprogramm für Linux und Unix-basierte Systeme, das wörtlich für “Liste (der) offenen Dateien” steht.

Seine Hauptfunktion besteht darin, Details über verschiedene Arten von Dateien abzurufen, die von verschiedenen laufenden Prozessen geöffnet wurden. Bei diesen Dateien kann es sich um normale Dateien, Verzeichnisse, Blockdateien, Netzwerk-Sockets, benannte Pipes usw. handeln.

Mit lsof können Sie verschiedene Prozesse finden, die eine Datei oder ein Verzeichnis sperren, einen Prozess, der auf einem Port lauscht, die Prozessliste eines Benutzers und alle Dateien, die ein Prozess sperrt. In diesem Artikel gehen wir zunächst auf die Installation des Programms und dann auf einige gängige Anwendungsbeispiele ein.

Installation von lsof

lsof ist bei den meisten Linux-Distributionen nicht standardmäßig verfügbar, kann aber leicht installiert werden. Verwenden Sie den folgenden Befehl, um lsof zu installieren:

CentOS / RHEL / Fedora:

$ sudo yum install lsof

für CentOS/RHEL 8 können Sie den DNF-Befehl verwenden

$ sudo dnf install lsof

Ubuntu / Debian:

$ sudo apt install lsof

Hilfe erhalten

Sie können eine zusammengefasste Liste der von lsof unterstützten Optionen erhalten, indem Sie die Flagge -? oder -h verwenden.

$ lsof -?
lsof 4.87
 letzte Revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 letzte FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 letzte man-Seite: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 verwendung: [-?abhKlnNoOPRtUvVX] [ |-c c] [ |-d s] [ D D] [ |-f[gG]] [ |-e s]
 [-F <x>[f]</x>] [-g <x>[s]</x>] [-i [i]] [ |-L <x>[l]</x>] [ m <x>[m]</x>] [ |-M] [-o [o]] [-p s]
[ |-r <x><x><x>[t]</x></x></x>] [-s [p:s]] [-S <x><x><x>[t]</x></x></x>] [-T <x><x><x>[t]</x></x></x>] [-u s] [ |-w] [-x <x>[fl]</x>] [-Z [Z]] [--] [Namen]
Standardwerte in Klammern; Komma-getrennte Menge (s) Elemente; Bindestrich-getrennte Bereiche.
  -?|-h list help -a AND-Auswahlen (OR) -b avoid kernel blocks
  -c c cmd c ^c /c/[bix] c w COMMAND Breite (9) d s dir s Dateien
  -d s select by FD set D D dir D tree *SLOW?* |-e s exempt s *RISKY*
  -i select IPv<x><x>[46]</x></x> files -K list tasKs (threads) -l list UID numbers
  -n keine Hostnamen -N select NFS files -o list file offset
  -O kein Overhead *RISKY* -P keine Portnamen -R liste paRent PID
  -s Dateigröße auflisten -t kurze Auflistung -T TCP/TPI-Informationen deaktivieren
  -U select Unix socket -v list version info -V verbose search
   |-w Warnungen ( ) -X TCP&UDP* Dateien überspringen -Z Z Kontext [Z]
  -- Ende Option scan
   f|-f Dateisystem oder -Dateinamen |-f[gG] flaGs
  -F <x>[f]</x> Felder auswählen; -F? für Hilfe
   |-L <x>[l]</x> list ( ) suppress (-) link counts < l (0 = alle; Standard = 0)
                                         m <x>[m]</x> use|create mount supplement
   |-M portMap Registrierung (-) -o o o 0t Offset-Ziffern (8)
  -p s exclude(^)|select PIDs -S <x><x><x>[t]</x></x></x> t second stat timeout (15)
  -T qs TCP/TPI Q,St (s) info
  -g <x>[s]</x> exclude(^)|Prozessgruppen-IDs auswählen und drucken
  -i i Auswahl nach IPv<x><x>[46]</x></x> Adresse: <x><x>[46]</x></x>[proto][@host|addr][:svc_list|port_list]
   |-r [t[m<fmt>]] Wiederholung alle t Sekunden (15); bis keine Dateien mehr vorhanden sind, - für immer.
       Ein optionales Suffix zu t ist m<fmt>; m muss t von <fmt> trennen und
      <fmt> ist ein strftime(3)-Format für die Markierungszeile.
  -s p:s exclude(^)|Wählen Sie Protokollzustände (p = TCP|UDP) nach Name(n) aus.
  -u s exclude(^)|select login|UID set s
  -x <x>[fl]</x> cross over d| D Dateisysteme oder symbolische Links
  names wählen benannte Dateien oder Dateien auf benannten Dateisystemen aus
Jeder kann alle Dateien auflisten; /dev-Warnungen deaktiviert; Kernel-ID-Prüfung deaktiviert.
$

Um detaillierte Informationen über die installierte Version zu erhalten, verwenden Sie:

$ lsof -v
lsof Versionsinformationen:
    revision: 4.87
    letzte Revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
    letzte FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
    letzte man-Seite: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
    erstellt: Tue Oct 30 16:28:19 UTC 2018
    erstellt von und am: mockbuild@x86-01.bsys.centos.org
    compiler: cc
    compiler-Version: 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
    compiler-Flags: -DLINUXV=310000 -DGLIBCV=217 -DHASIPv6 -DHASSELINUX -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DHAS_STRFTIME -DLSOF_VSTR="3.10.0" -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic
    loader-Flags: -L./lib -llsof -lselinux
    systeminformationen: Linux x86-01.bsys.centos.org 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    Jeder kann alle Dateien auflisten.
    /dev-Warnungen sind deaktiviert.
    Die Kernel-ID-Prüfung ist deaktiviert.
$

Ausgabefelder

die Struktur der lsof-Ausgabefelder ist standardmäßig wie folgt:

COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME

Die meisten dieser Felder sind selbsterklärend, mit Ausnahme der Felder FD und TYPE, die in gewisser Weise einzigartig für lsof sind und kurz erläutert werden sollen.

FD bezieht sich auf die Nummer des Dateideskriptors der Datei und TYPE auf den Typ des mit der Datei verbundenen Knotens. Wir werden uns nun die unterstützten Werte für diese beiden Felder ansehen.

Das FeldFD kann die folgenden Werte enthalten:

cwd aktuelles Arbeitsverzeichnis;
Lnn Bibliotheksverweise (AIX);
err FD Informationsfehler (siehe Spalte NAME);
jld Gefängnisverzeichnis (FreeBSD);
ltx gemeinsamer Bibliothekstext (Code und Daten);
Mxx hex memory-mapped type number xx.
m86 DOS Merge gemappte Datei;
mem memory-mapped file;
mmap memory-mapped device;
pd übergeordnetes Verzeichnis;
rtd Stammverzeichnis;
tr Kernel-Trace-Datei (OpenBSD);
txt Programmtext (Code und Daten);
v86 VP/ix abgebildete Datei;

Nach dem FeldFD folgen ein oder mehrere Zeichen, die den Modus beschreiben, in dem die Datei geöffnet ist:

r für Lesezugriff;
w für Schreibzugriff;
u für Lese- und Schreibzugriff;
leerzeichen, wenn der Modus unbekannt ist und kein Sperrzeichen folgt;
`-', wenn der Modus unbekannt ist und ein Sperrzeichen folgt.

Auf das Modus-Zeichen für FD kann weiterhin das LOCK-Zeichen folgen, dessen Beschreibung unten angegeben ist:

N für eine Solaris NFS-Sperre von unbekanntem Typ;
r für eine Lesesperre für einen Teil der Datei;
R für eine Lesesperre für die gesamte Datei;
w für eine Schreibsperre für einen Teil der Datei;
W für eine Schreibsperre für die gesamte Datei;
u für eine Lese- und Schreibsperre von beliebiger Länge;
U für eine Sperre von unbekanntem Typ;
x für eine SCO OpenServer Xenix-Sperre für einen Teil der Datei;
X für eine SCO OpenServer Xenix-Sperre für die gesamte Datei;
leerzeichen, wenn es keine Sperre gibt.

In ähnlicher Weise kann das Feld TYPE GDIR, GREG, VDIR, VREG, IPV4, IPV6 usw. enthalten. Eine vollständige Liste der in lsof unterstützten TYPE finden Sie in der Man Page.

Allgemeine Verwendung

Nachfolgend finden Sie einige der häufigsten Verwendungen des Befehls lsof. Der Befehl funktioniert auf allen Linux-Varianten und alle unten aufgeführten Befehlszeilenargumente sollten auf allen Plattformen funktionieren, wenn Sie dieselbe lsof-Version verwenden.

Alle offenen Dateien auflisten

Wenn Sie lsof ohne jegliche Optionen ausführen, werden alle Dateien aufgelistet, die derzeit von aktiven Prozessen geöffnet sind.

$ sudo lsof | less

Ausgabe:

COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 Wurzel rtd DIR 253,0 224 64 /
systemd 1 root txt REG 253,0 1632776 308905 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20064 16063 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265576 186547 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 16051 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 157424 16059 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,0 23968 59696 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 402384 16039 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,0 142144 15699 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,0 88720 84 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,0 43712 15703 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,0 277808 229793 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,0 91800 76005 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,0 127184 59698 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,0 61680 229827 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,0 20048 59690 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,0 155744 16048 /usr/lib64/libselinux.so.1

Liste nach Dateinamen

Um alle Prozesse aufzulisten, die eine bestimmte Datei geöffnet haben, können wir den Dateinamen als Argument angeben:

$ sudo lsof {Datei-Name}

Ausgabe:

$ sudo lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1000 root 6w REG 253,0 205 16777741 /var/log/messages
$

Offene Dateien nach Benutzernamen auflisten

In einem Mehrbenutzersystem können Sie die Liste der Dateien nach bestimmten benutzereigenen Prozessen filtern, indem Sie das Flag -u gefolgt von dem Benutzernamen verwenden.

$ sudo lsof -u {Benutzername}

Ausgabe:

$ sudo lsof -u abhisheknair
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/OFF KNOTENNAME
sshd 1239 abhisheknair cwd DIR 253,0 224 64 /
sshd 1239 abhisheknair rtd DIR 253,0 224 64 /
sshd 1239 abhisheknair txt REG 253,0 852856 425229 /usr/sbin/sshd
sshd 1239 abhisheknair mem REG 253,0 15488 17204727 /usr/lib64/security/pam_lastlog.so
sshd 1239 abhisheknair mem REG 253,0 15648 229829 /usr/lib64/libpam_misc.so.0.82.0
sshd 1239 abhisheknair mem REG 253,0 309248 17303270 /usr/lib64/security/pam_systemd.so
sshd 1239 abhisheknair mem REG 253,0 19616 17204728 /usr/lib64/security/pam_limits.so
sshd 1239 abhisheknair mem REG 253,0 11168 17204726 /usr/lib64/security/pam_keyinit.so
sshd 1239 abhisheknair mem REG 253,0 40800 17204735 /usr/lib64/security/pam_namespace.so

Wenn Sie alternativ Dateien auflisten möchten, die von einem beliebigen Benutzer außer einem bestimmten geöffnet wurden, verwenden Sie die Option -u, gefolgt von ^username, wie unten gezeigt:

$ sudo lsof -u ^{Benutzername}

Ausgabe:

$ sudo lsof -u ^root
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem 630 dbus cwd DIR 253,0 224 64 /
dbus-daem 630 dbus rtd DIR 253,0 224 64 /
dbus-daem 630 dbus txt REG 253,0 223232 50590133 /usr/bin/dbus-daemon
dbus-daem 630 dbus mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
dbus-daem 630 dbus mem REG 253,0 68192 59651 /usr/lib64/libbz2.so.1.0.6
dbus-daem 630 dbus mem REG 253,0 90248 16051 /usr/lib64/libz.so.1.2.7
dbus-daem 630 dbus mem REG 253,0 99944 59680 /usr/lib64/libelf-0.176.so
dbus-daem 630 dbus mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
dbus-daem 630 dbus mem REG 253,0 402384 16039 /usr/lib64/libpcre.so.1.2.0

Eine Möglichkeit, lsof zu verwenden, besteht darin, alle Prozesse eines bestimmten Benutzers schnell mit einem einzigen Befehl zu beenden. Dazu können wir kill mit lsof kombinieren, wie im folgenden Beispiel gezeigt (Ausführung als root):

# kill -9 `lsof -t -u {Benutzername}`

Wie im obigen Beispiel zu sehen, können wir mit dem Flag -t alle anderen Informationen außer der Prozess-ID herausfiltern. Dies kann bei der Automatisierung und der Erstellung von Skripten nützlich sein, wie das vorherige Beispiel zeigt, indem es mit dem Befehl kill kombiniert wird.

$ sudo lsof -t -u {Benutzername}

Ausgabe:

$ sudo lsof -t -u abhisheknair
1239
1240
$

Mit lsof können wir mehrere Argumente mit ODER-Logik kombinieren, wie unten gezeigt:

$ sudo lsof -u {Benutzername} -c {Prozess-Name}

Ausgabe:

$ sudo lsof -u ftpuser -c bash
BEFEHL PID BENUTZER FD TYP GERÄT GRÖSSE/OFF NODE NAME
bash 1240 abhisheknair cwd DIR 253,0 120 510681 /home/abhisheknair
bash 1240 abhisheknair rtd DIR 253,0 224 64 /
bash 1240 abhisheknair txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1240 abhisheknair mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1240 abhisheknair mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1240 abhisheknair mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1240 abhisheknair mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1240 abhisheknair mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1240 abhisheknair mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1240 abhisheknair mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1240 abhisheknair 0u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 1u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 2u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 255u CHR 136,0 0t0 3 /dev/pts/0
bash 1425 ftpuser cwd DIR 253,0 182 33578272 /home/ftpuser
bash 1425 ftpuser rtd DIR 253,0 224 64 /
bash 1425 ftpuser txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1425 ftpuser mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1425 ftpuser mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1425 ftpuser mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1425 ftpuser mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1425 ftpuser mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1425 ftpuser mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1425 ftpuser 0u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 1u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 2u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 255u CHR 4,1 0t0 1043 /dev/tty1
$

Wenn Sie eine logische UND-Verknüpfung wünschen, können Sie alternativ die Option -a verwenden.

$ sudo lsof -u {Benutzername} -c {Prozess-Name} -a

Ausgabe:

$ sudo lsof -u ftpuser -c bash -a
BEFEHL PID BENUTZER FD TYP GERÄT GRÖSSE/OFF NODE NAME
bash 1425 ftpuser cwd DIR 253,0 182 33578272 /home/ftpuser
bash 1425 ftpuser rtd DIR 253,0 224 64 /
bash 1425 ftpuser txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1425 ftpuser mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1425 ftpuser mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1425 ftpuser mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1425 ftpuser mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1425 ftpuser mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1425 ftpuser mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1425 ftpuser 0u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 1u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 2u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 255u CHR 4,1 0t0 1043 /dev/tty1
$

Offene Dateien nach Prozess auflisten

Wir können auch die von einem bestimmten Prozess geöffneten Dateien auflisten, indem wir die Option -c gefolgt von dem Prozessnamen verwenden.

$ sudo lsof -c {Prozess-Name}

Ausgabe:

$ sudo lsof -c ssh
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root cwd DIR 253,0 224 64 /
sshd 997 Wurzel rtd DIR 253,0 224 64 /
sshd 997 Wurzel txt REG 253,0 852856 425229 /usr/sbin/sshd
sshd 997 root mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
sshd 997 root mem REG 253,0 68192 59651 /usr/lib64/libbz2.so.1.0.6
sshd 997 root mem REG 253,0 99944 59680 /usr/lib64/libelf-0.176.so
sshd 997 root mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
sshd 997 root mem REG 253,0 15688 75906 /usr/lib64/libkeyutils.so.1.5
sshd 997 root mem REG 253,0 67104 186525 /usr/lib64/libkrb5support.so.0.1

Offene Dateien nach PID auflisten

Wenn Sie die von einem Prozess geöffneten Dateien auflisten möchten, aber statt des Prozessnamens seine ID angeben möchten, können Sie alternativ das Flag -p gefolgt von der Prozess-ID verwenden.

$ sudo lsof -p {Prozess-id}

Ausgabe:

$ sudo lsof -p 663
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firewalld 663 root cwd DIR 253,0 224 64 /
firewalld 663 root rtd DIR 253,0 224 64 /
firewalld 663 root txt REG 253,0 7144 50491220 /usr/bin/python2.7
firewalld 663 root mem REG 253,0 298828 50617647 /usr/lib64/girepository-1.0/NM-1.0.typelib
firewalld 663 root mem REG 253,0 343452 50507562 /usr/lib64/girepository-1.0/Gio-2.0.typelib
firewalld 663 root mem REG 253,0 12352 17202092 /usr/lib64/python2.7/lib-dynload/grpmodule.so
firewalld 663 root mem REG 253,0 29184 17202105 /usr/lib64/python2.7/lib-dynload/selectmodule.so
firewalld 663 root mem REG 253,0 168312 388240 /usr/lib64/libdbus-glib-1.so.2.2.2
firewalld 663 root mem REG 253,0 11976 34028597 /usr/lib64/python2.7/site-packages/_dbus_glib_bindings.so
firewalld 663 root mem REG 253,0 185712 50507559 /usr/lib64/girepository-1.0/GLib-2.0.typelib
  • Wenn Sie alle geöffneten Dateien mit Ausnahme derer, die von einem bestimmten Prozess geöffnet wurden, auflisten möchten, verwenden Sie -p gefolgt von ^process-id.
$ sudo lsof -p ^{process-id}

Offene Dateien auflisten, die das Verzeichnis

Um Prozesse aufzulisten, die Dateien unter einem bestimmten Verzeichnis geöffnet haben, verwenden Sie die Option D, gefolgt vom Verzeichnispfad.

$ sudo lsof D {Pfad}

Ausgabe:

$ sudo lsof D /var/log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
auditd 607 root 5w REG 253,0 1065095 425227 /var/log/audit/audit.log
firewalld 663 root 3w REG 253,0 13817 17663786 /var/log/firewalld
tuned 999 root 3w REG 253,0 13395 33574994 /var/log/tuned/tuned.log
rsyslogd 1000 root 6w REG 253,0 4302 16777753 /var/log/cron
rsyslogd 1000 root 7w REG 253,0 64740 16777755 /var/log/messages
rsyslogd 1000 root 8w REG 253,0 5513 16787904 /var/log/secure
rsyslogd 1000 root 9w REG 253,0 198 16777754 /var/log/maillog
$

Wenn Sie die Dateien in Unterverzeichnissen nicht rekursiv auflisten möchten, verwenden Sie die Flagge -d gefolgt vom Verzeichnispfad.

$ sudo lsof d {Pfad}

Ausgabe:

$ sudo lsof d /var/log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firewalld 663 root 3w REG 253,0 13817 17663786 /var/log/firewalld
rsyslogd 1000 root 6w REG 253,0 4302 16777753 /var/log/cron
rsyslogd 1000 root 7w REG 253,0 64740 16777755 /var/log/messages
rsyslogd 1000 root 8w REG 253,0 5833 16787904 /var/log/secure
rsyslogd 1000 root 9w REG 253,0 198 16777754 /var/log/maillog
$

Modus wiederholen

lsof kann im Wiederholungsmodus ausgeführt werden. Im Wiederholungsmodus erzeugt lsof in regelmäßigen Abständen Ausgaben und druckt sie aus. Auch hier gibt es zwei Wiederholungsmodi, die von lsof unterstützt werden, d.h. mit den Flags -r und r. Mit dem Flag -r wiederholt lsof die Ausführung, bis es ein Interrupt-/Kill-Signal vom Benutzer erhält, während mit dem Flag r der Wiederholungsmodus von lsof beendet wird, sobald die Ausgabe keine offenen Dateien mehr enthält. Zusätzlich können wir mit den Flags -r oder r eine Zeitverzögerung festlegen.

$ sudo lsof {Argumente} -r{Zeitintervall}

Ausgabe:

$ sudo lsof -u ftpuser -c bash D /usr/lib -a -r3
BEFEHL PID BENUTZER FD TYP GERÄT GRÖSSE/OFF KNOTENAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/OFF KNOTENNAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/OFF KNOTENNAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======

Offene Dateien mit Netzwerkprotokoll auflisten

lsof unterstützt die Auflistung aller Arten von Linux-Dateien, einschließlich Netzwerk-Sockets usw. So können wir mit dem Flag -i Details zu offenen Netzwerkverbindungen auflisten.

$ sudo lsof -i

Ausgabe:

$ sudo lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

Um alle Netzwerkverbindungen aufzulisten, die von einer bestimmten Prozess-ID verwendet werden, können Sie lsof wie folgt verwenden:

$ sudo lsof -i -a -p {process-id}

Ausgabe:

$ sudo lsof -i -a -p 997
BEFEHL PID BENUTZER FD TYP GERÄT GRÖSSE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
$

Oder um alle Netzwerkverbindungen aufzulisten, die von einem bestimmten Prozess verwendet werden, können wir den Prozessnamen wie folgt angeben:

$ sudo lsof -i -a -c {Prozess-Name}

Ausgabe:

$ sudo lsof -i -a -c ssh
BEFEHL PID BENUTZER FD TYP GERÄT GRÖSSE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

Wir können die Ausgabe von lsof mit dem Flag -i nach dem Typ des Netzwerkprotokolls filtern, d.h. nach TCP oder UDP, indem wir den Protokolltyp angeben.

$ sudo lsof -i {protocol}

Ausgabe:

$ sudo lsof -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

ODER

Ausgabe:

$ sudo lsof -i udp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
$

Offene Dateien nach Port auflisten

Wir können die Ausgabe von lsof mit dem Flag -i auch nach Portnummer filtern, indem wir die folgende Befehlssyntax verwenden:

$ sudo lsof -i :{Port-Nummer}

Ausgabe:

$ sudo lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

Offene Dateien nach IPv4/IPv6 auflisten

Sie können die Liste der Netzwerkverbindungen filtern, indem Sie sie entweder auf IPv4 oder IPv6 beschränken. Verwenden Sie die folgende Befehlssyntax, um nur die IP v4-Liste zu erhalten:

$ sudo lsof -i4

Ausgabe:

$ sudo lsof -i4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

ODER um nur IPv6 Details zu erhalten, verwenden Sie:

$ sudo lsof -i6

Ausgabe:

$ sudo lsof -i6
BEFEHL PID BENUTZER FD TYP GERÄTEGRÖSSE/OFF KNOTENNAME
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
$

Offene Dateien auf NFS auflisten

lsof kann auch alle NFS-Dateien auflisten, die derzeit von einem Benutzer geöffnet sind.

$ sudo lsof -N -u abhisheknair -a

Gesperrte gelöschte Dateien auflisten

Manchmal kommt es vor, dass Dateien in Linux gelöscht werden, aber immer noch von einem oder mehreren Prozessen gesperrt sind. Diese Dateien werden dann nicht in der normalen Dateisystemliste (z.B. mit dem Befehl ls ) aufgeführt, verbrauchen aber weiterhin Speicherplatz, wie die Ausgabe von df zeigt. Dies gilt insbesondere für große Dateien, die absichtlich gelöscht wurden, um Speicherplatz freizugeben, ohne die Prozesssperre aufzuheben. Sie können solche Prozesse mit lsof wie folgt finden:

$ sudo lsof {Pfad} | grep gelöscht

Ausgabe:

$ sudo lsof / | grep deleted
firewalld 654 root 8u REG 253,0 4096 16777726 /tmp/#16777726 (gelöscht)
tuned 968 root 8u REG 253,0 4096 16777720 /tmp/#16777720 (gelöscht)
$

Fazit

lsof bietet eine Reihe von Optionen zur Anpassung der Ausgabe an Ihre Bedürfnisse. Es ist ein nützliches Dienstprogramm für alltägliche Aufgaben der System- und Netzwerkverwaltung. Die Möglichkeit, verschiedene Argumente miteinander zu kombinieren, macht es noch nützlicher und ermöglicht es Ihnen, die gewünschte Ausgabe auf einfache Weise zu erhalten. In der Manpage von lsof finden Sie alle unterstützten Argumente und deren Verwendung.

$ man lsof