Wer unter Linux herausfinden möchte, welcher Prozess gerade eine Datei verwendet, welcher Dienst einen Port belegt oder warum sich ein Dateisystem nicht aushängen lässt, sollte den Befehl lsof kennen.
lsof gehört zu den klassischen Diagnosewerkzeugen der Linux-Administration. Obwohl der Name zunächst nur nach einem Werkzeug zum Anzeigen geöffneter Dateien klingt, kann lsof erheblich mehr. Das liegt vor allem an einem grundlegenden Prinzip Unix-artiger Betriebssysteme: Viele Ressourcen werden über Datei- beziehungsweise Deskriptor-Schnittstellen angesprochen.
Dadurch eignet sich lsof nicht nur zur Untersuchung von Dateien, sondern auch für Prozesse, Netzwerkverbindungen, Sockets, Verzeichnisse und zahlreiche Troubleshooting-Aufgaben.
Was bedeutet lsof?
Der Name steht für:
List Open Files
Der einfachste Aufruf lautet:
lsof
Damit werden die aktuell geöffneten Dateien beziehungsweise Ressourcen angezeigt, soweit sie für den aufrufenden Benutzer sichtbar sind.
Auf einem produktiven Server kann die Ausgabe allerdings enorm umfangreich werden. In der Praxis wird lsof deshalb meistens zusammen mit Filtern und Optionen verwendet.
Ist lsof bereits installiert?
lsof ist auf vielen Linux-Systemen verfügbar, muss aber nicht zwingend vorinstalliert sein.
Ob das Programm vorhanden ist, lässt sich beispielsweise prüfen mit:
lsof -v
oder:
command -v lsof
Unter Debian und Ubuntu kann das Paket bei Bedarf installiert werden:
sudo apt update sudo apt install lsof
Unter Fedora beziehungsweise verwandten Distributionen erfolgt die Installation beispielsweise über den jeweiligen Paketmanager:
sudo dnf install lsof
Anschließend steht der Befehl systemweit zur Verfügung.
Die grundlegende Ausgabe verstehen
Ein Aufruf von:
lsof
liefert typischerweise Spalten wie:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Die wichtigsten Informationen sind:
COMMAND
Name des Prozesses beziehungsweise Programms.
PID
Process ID des Prozesses.
USER
Benutzer, unter dessen Kontext der Prozess läuft.
FD
File Descriptor beziehungsweise Dateideskriptor.
TYPE
Art des geöffneten Objekts.
DEVICE
Gerät, auf dem sich die Ressource befindet.
SIZE/OFF
Größe beziehungsweise aktueller Offset.
NODE
Inode beziehungsweise eine entsprechende Objektkennung.
NAME
Name oder Pfad der geöffneten Ressource.
Damit lässt sich nachvollziehen, welcher Prozess unter welchem Benutzer auf welche Ressource zugreift.
Warum sudo bei lsof wichtig sein kann
Ein normaler Benutzer sieht abhängig von Distribution, Kernel-Konfiguration und Sicherheitsmechanismen möglicherweise nicht alle Informationen anderer Prozesse.
Für eine umfassendere Analyse wird lsof daher häufig mit Root-Rechten ausgeführt:
sudo lsof
Das ist insbesondere bei Serverdiensten und systemweiten Fehleranalysen relevant.
Herausfinden, welcher Prozess eine Datei verwendet
Einer der wichtigsten Anwendungsfälle besteht darin, herauszufinden, welcher Prozess eine bestimmte Datei geöffnet hat.
Beispielsweise:
sudo lsof /var/log/syslog
Die Ausgabe kann zeigen, welche Prozesse aktuell auf diese Datei zugreifen.
Das ist beispielsweise interessant bei:
- Logdateien
- Konfigurationsdateien
- Datenbanken
- Backup-Dateien
- temporären Dateien
- gemounteten Datenträgern
Ein bestimmtes Verzeichnis untersuchen
Auch Verzeichnisse können untersucht werden.
Beispielsweise:
sudo lsof /var/log
Dabei ist allerdings wichtig: Dieser Aufruf bedeutet nicht automatisch, dass sämtliche Dateien in allen Unterverzeichnissen rekursiv durchsucht werden.
Für eine Untersuchung eines kompletten Verzeichnisbaums bietet lsof die Option +D:
sudo lsof +D /var/log
Damit wird der angegebene Verzeichnisbaum durchsucht.
Bei großen Verzeichnisstrukturen kann dieser Vorgang entsprechend aufwendig sein.
Soll nur die oberste Ebene eines Verzeichnisses betrachtet werden, kann +d verwendet werden:
sudo lsof +d /var/log
Alle geöffneten Dateien eines Benutzers anzeigen
Mit der Option -u lässt sich nach einem Benutzer filtern.
Beispielsweise:
sudo lsof -u max
Damit werden die von Prozessen des Benutzers max geöffneten Ressourcen angezeigt.
Das kann bei der Benutzerverwaltung, Prozessanalyse oder Fehlersuche hilfreich sein.
Einen Benutzer ausschließen
lsof unterstützt auch Ausschlussbedingungen.
Beispielsweise:
sudo lsof -u ^root
Damit werden Prozesse des Benutzers root ausgeschlossen.
Das ^ dient hierbei als Negation.
Einen bestimmten Prozess untersuchen
Ist die PID eines Prozesses bekannt, kann gezielt untersucht werden, welche Ressourcen dieser geöffnet hat.
Beispielsweise:
sudo lsof -p 1234
Damit werden die geöffneten Ressourcen des Prozesses mit der PID 1234 angezeigt.
Die PID lässt sich beispielsweise mit:
ps aux
oder:
pgrep nginx
ermitteln.
Anschließend könnte ein bestimmter Prozess genauer untersucht werden:
sudo lsof -p 1234
lsof und Netzwerkverbindungen
Besonders interessant wird lsof bei der Netzwerkdiagnose.
Mit:
sudo lsof -i
werden Netzwerkressourcen angezeigt.
Damit können unter anderem TCP- und UDP-Verbindungen sowie lauschende Netzwerkdienste sichtbar gemacht werden.
Nur TCP-Verbindungen anzeigen
Für TCP kann verwendet werden:
sudo lsof -i TCP
Damit werden TCP-bezogene Netzwerkressourcen angezeigt.
Für UDP entsprechend:
sudo lsof -i UDP
Herausfinden, welcher Prozess einen Port verwendet
Dies ist wahrscheinlich einer der bekanntesten lsof-Anwendungsfälle.
Angenommen, ein Webserver soll auf Port 443 starten, meldet jedoch:
Address already in use
Dann stellt sich die Frage:
Welcher Prozess verwendet Port 443?
Die Antwort liefert:
sudo lsof -i :443
Eine Ausgabe könnte beispielsweise Informationen zu einem Webserverprozess enthalten.
Für Port 80:
sudo lsof -i :80
Für SSH auf Port 22:
sudo lsof -i :22
Damit ist lsof besonders praktisch bei Konflikten zwischen Diensten.
Nur lauschende TCP-Dienste anzeigen
Sollen gezielt TCP-Sockets im Zustand LISTEN betrachtet werden, kann ein Statusfilter verwendet werden:
sudo lsof -iTCP -sTCP:LISTEN
Sehr praktisch ist die Kombination:
sudo lsof -iTCP -sTCP:LISTEN -P -n
Dabei bewirkt -P, dass Portnummern nicht in Dienstnamen umgewandelt werden.
-n verhindert die Auflösung von IP-Adressen in Hostnamen.
Das beschleunigt die Ausgabe und macht insbesondere bei der technischen Fehlersuche direkt sichtbar, welche IP-Adressen und Portnummern tatsächlich verwendet werden.
Warum -n und -P praktisch sind
Ohne weitere Optionen versucht lsof gegebenenfalls Namen aufzulösen.
Bei Netzwerkproblemen kann gerade diese Namensauflösung unerwünscht sein.
Deshalb ist folgende Kombination sehr verbreitet:
sudo lsof -nP -i
-n bedeutet:
Keine Auflösung von IP-Adressen zu Hostnamen.
-P bedeutet:
Keine Umwandlung von Portnummern in Dienstnamen.
Statt eines Dienstnamens wird somit beispielsweise direkt:
:443
angezeigt.
Einen bestimmten TCP-Port untersuchen
Die Optionen lassen sich kombinieren:
sudo lsof -nP -iTCP:443
Damit werden TCP-Ressourcen für Port 443 untersucht.
Soll ausschließlich nach lauschenden Prozessen gesucht werden:
sudo lsof -nP -iTCP:443 -sTCP:LISTEN
Das ist ein hervorragender Diagnosebefehl für Webserver.
IPv4 untersuchen
Für IPv4 kann verwendet werden:
sudo lsof -i4
Für IPv6:
sudo lsof -i6
Das ist beispielsweise hilfreich, wenn ein Dienst nur über IPv6 erreichbar ist, obwohl eigentlich IPv4 erwartet wurde – oder umgekehrt.
lsof und gelöschte Dateien
Eine besonders nützliche Funktion von lsof betrifft gelöschte Dateien, die von laufenden Prozessen weiterhin geöffnet sind.
Das kann zunächst widersprüchlich erscheinen.
Unter Linux kann eine Datei aus einem Verzeichnis entfernt werden, während ein Prozess noch einen offenen Dateideskriptor darauf besitzt. Der Prozess kann weiterhin auf den Inhalt zugreifen. Der belegte Speicherplatz wird unter Umständen erst freigegeben, wenn der letzte offene Verweis geschlossen wird.
Das führt gelegentlich zu einem typischen Problem:
Eine sehr große Logdatei wurde gelöscht, aber:
df -h
zeigt weiterhin eine nahezu volle Partition.
du scheint dagegen deutlich weniger belegten Speicher zu melden.
In diesem Fall lohnt sich:
sudo lsof +L1
Damit lassen sich geöffnete Dateien mit einer Link-Anzahl kleiner als 1 finden – also insbesondere Dateien, deren Verzeichniseintrag bereits gelöscht wurde.
In der Ausgabe können solche Objekte zusätzlich mit:
(deleted)
gekennzeichnet sein.
Warum df und du unterschiedliche Werte anzeigen können
Dieses Szenario erklärt einen bekannten Unterschied zwischen:
df -h
und:
du -sh /
du untersucht erreichbare Dateien innerhalb des Verzeichnisbaums.
df betrachtet dagegen die Belegung des Dateisystems.
Hat ein Prozess eine bereits gelöschte große Datei weiterhin geöffnet, kann deren Speicherplatz noch belegt sein, obwohl du sie nicht mehr über den ursprünglichen Verzeichnisnamen findet.
lsof ist in solchen Situationen eines der wichtigsten Diagnosewerkzeuge.
Was tun bei einer gelöschten, aber noch geöffneten Datei?
Zunächst sollte festgestellt werden, welcher Prozess die Datei offen hält:
sudo lsof +L1
Anschließend kann geprüft werden, ob der betreffende Dienst kontrolliert neu gestartet werden kann.
Beispielsweise:
sudo systemctl restart DIENST
Dabei sollte nicht blind irgendein Prozess beendet werden. Insbesondere bei Datenbanken oder produktiven Anwendungen kann ein unkontrolliertes Beenden zu Problemen führen.
Warum lässt sich ein Dateisystem nicht aushängen?
Ein weiteres klassisches Problem:
sudo umount /mnt/daten
meldet sinngemäß:
target is busy
Das bedeutet häufig, dass ein Prozess noch auf eine Ressource innerhalb des Dateisystems zugreift.
Hier kann lsof helfen:
sudo lsof /mnt/daten
Je nach Situation kann auch eine rekursive Betrachtung sinnvoll sein:
sudo lsof +D /mnt/daten
Damit lässt sich herausfinden, welche Prozesse das Dateisystem noch verwenden.
Prozess anhand eines Programmnamen untersuchen
Mit -c lässt sich nach dem Namen eines Kommandos beziehungsweise Prozesses filtern.
Beispielsweise:
sudo lsof -c nginx
Damit werden Ressourcen von Prozessen angezeigt, deren Kommando zum angegebenen Filter passt.
Auch andere Dienste können entsprechend untersucht werden.
Mehrere Filter kombinieren
lsof bietet umfangreiche Möglichkeiten zur Kombination von Auswahlkriterien.
Dabei sollte jedoch beachtet werden, dass die Verknüpfungslogik verschiedener Selektionsoptionen nicht immer intuitiv ist. Wer komplexe Filter konstruiert, sollte deshalb die Manpage der konkret installierten Version konsultieren:
man lsof
Gerade bei administrativen Skripten ist es besser, die Filterlogik genau zu verstehen, statt sich auf eine vermeintlich offensichtliche Kombination zu verlassen.
lsof zusammen mit grep
Natürlich lässt sich lsof mit klassischen Unix-Werkzeugen kombinieren.
Beispielsweise:
sudo lsof | grep "/var/log"
Oder:
sudo lsof -nP -i | grep LISTEN
Für viele Anwendungsfälle sind die eingebauten Filter von lsof allerdings vorzuziehen, weil dadurch bereits die erzeugte Datenmenge reduziert wird.
lsof regelmäßig aktualisieren
Bei der Fehlersuche kann es interessant sein, die Ausgabe regelmäßig neu aufzurufen.
Dafür eignet sich beispielsweise watch:
watch 'sudo lsof -nP -iTCP -sTCP:LISTEN'
Die Anzeige wird regelmäßig aktualisiert.
Das kann hilfreich sein, wenn ein Dienst gestartet oder beendet wird und dessen Netzwerkverhalten beobachtet werden soll.
lsof und ss – was ist besser?
Für Netzwerkdiagnosen überschneiden sich lsof und ss.
Mit ss können beispielsweise lauschende TCP- und UDP-Sockets untersucht werden:
sudo ss -tulpen
ss ist speziell für Socket- und Netzwerkstatistiken ausgelegt und auf modernen Linux-Systemen häufig das bevorzugte Werkzeug für detaillierte Netzwerkanalysen.
lsof verfolgt dagegen einen breiteren Ansatz.
Es verbindet Informationen über:
- Prozesse
- Dateien
- Dateideskriptoren
- Verzeichnisse
- Geräte
- Netzwerk-Sockets
Deshalb lautet die Antwort nicht unbedingt lsof oder ss.
In der Praxis ergänzen sich beide Werkzeuge hervorragend.
lsof in der Sicherheitsanalyse
Auch aus Security-Sicht kann lsof hilfreich sein.
Beispielsweise können Administratoren überprüfen, welche Prozesse Netzwerkports geöffnet haben:
sudo lsof -nP -iTCP -sTCP:LISTEN
Ein unerwarteter Dienst auf einem unbekannten Port sollte näher untersucht werden.
Dabei kann zunächst die PID ermittelt und anschließend der Prozess analysiert werden:
ps -fp PID
Danach:
sudo lsof -p PID
So lässt sich erkennen, auf welche Dateien, Bibliotheken oder Netzwerkressourcen der Prozess zugreift.
lsof ersetzt dabei natürlich keine EDR-, SIEM- oder Forensik-Lösung. Für die erste manuelle Untersuchung eines Linux-Systems ist es jedoch ausgesprochen hilfreich.
Verdächtigen Prozess untersuchen
Angenommen, bei einer Kontrolle wird ein unerwarteter Prozess mit der PID 4711 entdeckt.
Zunächst:
ps -fp 4711
Danach:
sudo lsof -p 4711
Für Netzwerkaktivitäten könnte zusätzlich verwendet werden:
sudo lsof -nP -i
oder gezielter:
sudo ss -tpn
So entsteht Schritt für Schritt ein besseres Bild davon, was auf dem System passiert.
lsof in Shell-Skripten
Auch in Skripten kann lsof nützlich sein.
Beispielsweise könnte vor dem Start einer Anwendung geprüft werden, ob ein bestimmter Port bereits verwendet wird.
Ein einfaches Beispiel:
if sudo lsof -iTCP:8080 -sTCP:LISTEN -t >/dev/null; then
echo "Port 8080 wird bereits verwendet."
else
echo "Port 8080 ist derzeit nicht belegt."
fi
Die Option -t sorgt für eine kompakte Ausgabe der passenden Prozess-IDs und eignet sich deshalb besonders für Skripte.
Allerdings sollte bei automatisierten Entscheidungen berücksichtigt werden, dass Sichtbarkeit und Ergebnis von Berechtigungen und Systemkonfiguration abhängen können.
Prozess-ID für einen Port ausgeben
Wer lediglich die PID benötigt, kann beispielsweise verwenden:
sudo lsof -t -iTCP:443 -sTCP:LISTEN
Das ist nützlich für Skripte oder die Weiterverarbeitung mit anderen Programmen.
Prozesse nicht vorschnell beenden
Eine häufige Versuchung besteht darin, das Ergebnis von lsof unmittelbar mit kill zu kombinieren.
Technisch ist das möglich. Beispielsweise könnte eine PID an andere Befehle übergeben werden.
Auf produktiven Systemen sollte jedoch immer zunächst geprüft werden:
- Welcher Prozess ist das?
- Welcher Dienst gehört dazu?
- Warum verwendet er die Ressource?
- Kann der Dienst kontrolliert gestoppt oder neu gestartet werden?
- Gibt es aktive Benutzer oder Transaktionen?
Ein belegter Port ist nicht automatisch ein Fehler. Häufig verwendet schlicht der dafür vorgesehene Dienst diesen Port.
Praktische Befehle im Überblick
Alle sichtbaren geöffneten Ressourcen anzeigen:
sudo lsof
Eine bestimmte Datei untersuchen:
sudo lsof /pfad/datei
Ressourcen eines Benutzers anzeigen:
sudo lsof -u max
Einen Prozess anhand seiner PID untersuchen:
sudo lsof -p 1234
Nach einem Kommandonamen filtern:
sudo lsof -c nginx
Alle Netzwerkressourcen anzeigen:
sudo lsof -i
Netzwerkdaten ohne Namensauflösung anzeigen:
sudo lsof -nP -i
Port 443 untersuchen:
sudo lsof -i :443
Nur lauschende TCP-Sockets anzeigen:
sudo lsof -nP -iTCP -sTCP:LISTEN
IPv4-Verbindungen anzeigen:
sudo lsof -i4
IPv6-Verbindungen anzeigen:
sudo lsof -i6
Gelöschte, aber noch geöffnete Dateien finden:
sudo lsof +L1
Verzeichnisbaum untersuchen:
sudo lsof +D /pfad
Nur PIDs ausgeben:
sudo lsof -t -iTCP:443 -sTCP:LISTEN
Hilfe und Dokumentation
Eine Übersicht der Optionen liefert:
lsof -h
Die ausführliche Dokumentation befindet sich in der Manpage:
man lsof
Gerade bei komplexeren Filterbedingungen, symbolischen Links, Dateisystemen oder ungewöhnlichen Prozesssituationen lohnt sich ein Blick in die Dokumentation der installierten Version.
Typische Einsatzgebiete von lsof
In der täglichen Linux-Administration ist lsof besonders hilfreich, wenn Fragen wie diese beantwortet werden müssen:
Welcher Prozess verwendet diese Datei?
sudo lsof /pfad/datei
Wer belegt Port 443?
sudo lsof -nP -iTCP:443
Welche TCP-Dienste lauschen auf dem Server?
sudo lsof -nP -iTCP -sTCP:LISTEN
Warum wird Speicherplatz nach dem Löschen einer Datei nicht freigegeben?
sudo lsof +L1
Welche Ressourcen verwendet Prozess 1234?
sudo lsof -p 1234
Welche Netzwerkressourcen sind derzeit geöffnet?
sudo lsof -nP -i
Damit deckt ein einziges Werkzeug erstaunlich viele typische Administrationsprobleme ab.
lsof gehört zu den Werkzeugen, deren tatsächlicher Nutzen sich häufig erst im täglichen Linux-Betrieb zeigt. Der Befehl verbindet Prozesse, Dateien, Dateideskriptoren und Netzwerkressourcen und ermöglicht dadurch einen tiefen Einblick in ein laufendes System.
Besonders wertvoll ist lsof bei der Fehlersuche: Ein Port ist bereits belegt, ein Dateisystem lässt sich nicht aushängen oder eine gelöschte Logdatei beansprucht weiterhin mehrere Gigabyte Speicherplatz – in all diesen Fällen kann lsof schnell zur entscheidenden Information führen.
Für die tägliche Administration sind insbesondere diese drei Befehle einen Platz im persönlichen Werkzeugkasten wert:
sudo lsof -nP -iTCP -sTCP:LISTEN
zeigt lauschende TCP-Dienste,
sudo lsof -i :443
zeigt Prozesse, die Port 443 verwenden, und
sudo lsof +L1
hilft dabei, gelöschte Dateien aufzuspüren, die weiterhin von Prozessen geöffnet sind.
Zusammen mit Werkzeugen wie ps, ss, systemctl, find, df und du gehört lsof damit zu den vielseitigsten Diagnosewerkzeugen für Linux-Administratoren.