lsof
lsof (List open files) ist ein von Vic Abell entwickeltes Open-Source-Werkzeug, das auf Unix-Systemen anzeigt, welche Programme welche Dateien oder Sockets geöffnet halten.
lsof | |
---|---|
Basisdaten | |
Entwickler | Vic Abell |
Erscheinungsjahr | 1994 (Version 3) |
Aktuelle Version | 4.89 (7. Juni 2015) |
Betriebssystem | AIX 5.3, Darwin 9 (macOS 10.5), FreeBSD 4.9 (x86), FreeBSD 7 (amd64), Linux 2.1.72 (x86, amd64), Solaris 9 und 10. |
Programmiersprache | C |
Kategorie | Statusanalyse |
Lizenz | Zur BSD-Lizenz kompatiblen Lizenz |
deutschsprachig | ja |
https://people.freebsd.org/~abe/ |
Ausgabeformat
Offene Dateien sind bei lsof
- UNIX Domain Sockets (type=unix)
- Reguläre Dateien (type=REG)
- FIFOs (type=FIFO)
- Geöffnete Verzeichnisse (type=DIR)
- Internet Domain sockets (type=IPv4 oder type=IPv6)
- Character devices (Spezialdateien wie /dev/random; type=CHR)
und noch einige dutzend andere, wie AX.25-Sockets, Block-Devices usw.[1]
Die Ausgabe sieht dabei so aus:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME ... ssh-agent 2678 lbo 3u unix 0xffff88013e71cac0 0t0 7624 /tmp/ssh-oyerzGJI2633/agent.2633 ssh-agent 2678 lbo 6w FIFO 0,8 0t0 4795 pipe ssh-agent 2678 lbo 8r FIFO 0,8 0t0 4799 pipe system-co 2866 lbo mem REG 8,6 162968 1050015 /usr/lib/x86_64-linux-gnu/libssh2.so.1.0.1 sshd 3031 root cwd DIR 8,6 4096 2 / sshd 3031 root rtd DIR 8,6 4096 2 / sshd 3031 root txt REG 8,6 517088 1053360 /usr/sbin/sshd sshd 3031 root mem REG 8,6 131107 1187879 /lib/x86_64-linux-gnu/libpthread-2.13.so sshd 3031 root mem REG 8,6 80712 1180726 /lib/x86_64-linux-gnu/libresolv-2.13.so sshd 3031 root 0u CHR 1,3 0t0 1028 /dev/null sshd 3031 root 3u IPv4 8026 0t0 TCP *:ospfapi (LISTEN) sshd 3031 root 4u IPv6 8028 0t0 TCP *:ospfapi (LISTEN) ssh 7314 lbo cwd DIR 8,7 4096 5767169 /home/lbo ssh 8602 lbo 3r IPv6 68343 0t0 TCP [2001:470:1f0b:2f2:3189:67c1:b550:9400]:56194->obsd-lbo6:ssh (ESTABLISHED) ... udevd 3226 root 11u netlink 0t0 10784 KOBJECT_UEVENT ...
Hier kann man sehr gut die unterschiedlichen Typen sehen (Spalte TYPE), hier vor allem anhand des sshd und ssh-Client.
Ausgabeformat für andere Programme
Für die Verarbeitung der Ausgabe mit Scripten kann mit der Option -F ein alternatives Ausgabeformat erzeugt werden, bei dem in jeder Zeile ein identifizierender Buchstabe gefolgt vom entsprechenden Wert steht. Für jeden laufenden Prozess wird ein mehrzeiliger Abschnitt angelegt, der eingeleitet wird durch die Zeile mit dem Buchstaben p und der Prozess-ID. Innerhalb eines Prozessabschnitts befinden sich Werte wie die User-ID des Prozesses, eingeleitet durch u, außerdem mehrere Abschnitte zu den geöffneten Dateien, eingeleitet durch eine Zeile mit dem Buchstaben f und dem File-Descriptor. Eine beispielhafte Ausgabe für den Prozess sshd mit zwei Datei-Abschnitten sähe dann so aus:
... p5502 g5502 R1 csshd u0 Lroot fcwd a l tDIR D0x811 s4096 i2 k25 n/ ftxt a l tREG D0x811 s540896 i657919 k1 n/usr/sbin/sshd ...
Verwendet wird dieses Ausgabeformat z. B. von einigen Scripten, die mit lsof mitgeliefert werden.
Alltäglicher Nutzen
Sehr oft wird lsof genutzt, wenn der Unix-Befehl umount sich weigert, ein Gerät auszuhängen, wenn noch Dateien auf diesem Gerät bzw. in dessen Mount-Verzeichnis geöffnet sind (die Raute stellt eine Root-Shell dar):
# umount /mount/path umount: /mount/path: device is busy.
Durch lsof lässt sich nun einfach feststellen, welche Programme beendet werden müssen, um ein erfolgreiches Aushängen zu gewährleisten:
# lsof /mount/path bash 3156 usr cwd DIR 8,33 4096 2 /mount/path
Aus dem gefundenen Eintrag lässt sich entnehmen, dass der Nutzer usr noch eine bash-Shell mit PID 3156 laufen hat, die /mount/path als Arbeitsverzeichnis (Current Working Directory) nutzt, erkennbar am Typ DIR.
Die mount-Version aus dem util-linux-Paket weist sogar auf lsof hin:
# umount /mount/path umount: /mount/path: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1))