...

lsof effektiv einsetzen: Offene Dateien und Prozesse analysieren

Ich setze lsof linux ein, um in Sekunden zu sehen, welcher Prozess welche Datei, Socket oder welchen Port offen hält. So erkenne ich blockierte Logs, belegte Ports und gesperrte Dateien ohne Umwege und löse Störungen zielgerichtet.

Zentrale Punkte

Damit der Einstieg gelingt, fasse ich die wichtigsten Aspekte kurz zusammen.

  • Ressourcen sichtbar machen: Prozesse, Dateien, Verzeichnisse, Geräte, Pipes, Sockets.
  • Filter nutzen: nach Prozessname (-c), PID (-p), Benutzer (-u), Datei, Verzeichnis (+d/+D), Port (-i).
  • Fehler eingrenzen: gesperrte Dateien finden, Portkonflikte auflösen, hängende Dienste zuordnen.
  • Netzwerk prüfen: aktive Verbindungen und belegte Ports schnell identifizieren.
  • Workflow straffen: erst eingrenzen, dann gezielt prüfen, anschließend handeln.

Warum lsof im Alltag zählt

Ich nutze lsof, wenn ein Dienst nicht startet, eine Datei „busy“ meldet oder ein Port bereits belegt ist. Das Tool verbindet Datei, Prozess, Benutzer und Netzwerk in einer klaren Sicht. Ich erkenne sofort, welcher PID den Zugriff hält und seit wann. So handle ich statt zu raten und beende den richtigen Prozess, statt versehentlich den falschen Dienst zu stoppen. Gerade auf produktiven Servern gewinne ich damit Minuten bis Stunden, weil ich die Ursache direkt am Prozess festmache. Dieser Ansatz spart Tickets, reduziert Ausfälle und schafft belastbare Erkenntnisse.

Grundsyntax und Ausgabe verstehen

Die Grundform lautet lsof [Optionen] <Ziel> und liefert ohne Parameter alle aktuell offenen Objekte. Auf stark ausgelasteten Systemen filtere ich die Ausgabe, statt mich durch tausende Zeilen zu arbeiten. Wichtig ist, dass Linux „Datei“ weit fasst: dazu zählen Verzeichnisse, Geräte, Bibliotheken und Netzwerk-Sockets. In der Ausgabe helfen Spalten wie COMMAND, PID, USER, FD, TYPE, NAME. Ich richte meinen Blick zuerst auf FD (Dateideskriptor), TYPE (REG, DIR, IPv4/6) und NAME mit Pfad oder Portangabe. Wer diese Spalten liest, versteht in kurzer Zeit den aktuellen Systemzustand und ordnet Ressourcen sauber zu Prozessen.

Installation und Berechtigungen in der Praxis

Auf vielen Distributionen ist lsof nicht vorinstalliert. Ich installiere es daher frühzeitig über den Paketmanager (apt install lsof, dnf install lsof, yum install lsof oder pacman -S lsof), damit es im Incident-Fall sofort zur Verfügung steht. Für eine vollständige Sicht führe ich lsof in der Regel mit sudo aus, weil ohne erhöhte Rechte viele Einträge als „permission denied“ enden oder ganz fehlen. Ich beginne trotzdem bewusst ohne Root, prüfe, wie weit ich komme, und hebe Rechte nur an, wenn es nötig ist. Unter Systemen mit SELinux oder AppArmor beachte ich, dass Sicherheitskontexte die Sicht einschränken können; je nach Build zeigt lsof Kontexte zusätzlich an. Warnungen unterdrücke ich bei Massenabfragen mit -w, damit Skripte robust bleiben.

FD-Felder und Typen sicher lesen

Die Spalte FD ist mein Schlüssel zum Verständnis. Häufige Werte sind:

  • cwd: aktuelles Arbeitsverzeichnis des Prozesses.
  • txt: die ausführbare Datei (Textsegment) des Prozesses.
  • mem: geladene Shared Libraries und abgebildete Dateien (Memory Mappings).
  • 0u,1w,2w: Standard-Deskriptoren (stdin, stdout, stderr) mit Modus r (read), w (write) oder u (read/write).
  • höhere Zahlen wie 3u, 7r: reguläre offene Deskriptoren, oft Dateien, Sockets oder Pipes.

Aus TYPE lese ich die Objektklasse: REG (reguläre Datei), DIR (Verzeichnis), CHR/BLK (Zeichen-/Blockgerät), FIFO (Pipe), IPv4/IPv6 (Netzwerk), UNIX (Unix-Domain-Socket). In NAME steht der Pfad oder bei Sockets der Endpunkt, z. B. TCP *:80 (LISTEN) oder UDP 127.0.0.1:123. Wenn ich (deleted) am Ende sehe, weiß ich, dass eine Datei entfernt wurde, aber noch von einer PID gehalten wird – ein typischer Grund für „verschwundenen“ Plattenplatz.

Gezielt filtern: Dateien, Verzeichnisse, Ports

Ich grenze zuerst den Kontext ein und starte dann mit einem passenden Filter. Für ein Verzeichnis verwende ich lsof +D /var/log (rekursiv) oder lsof +d /var/log (nur der Ordner selbst). Einzelne Dateien prüfe ich direkt, etwa lsof /var/log/syslog, um schreibende Prozesse zu sehen. Für Ports setze ich lsof -i:80, lsof -i:443 oder generisch lsof -i ein. Ich kombiniere das gern mit -nP, damit lsof IPs und Ports nicht auflöst und schneller arbeitet. So entsteht aus einem unübersichtlichen Systemzustand in kürzester Zeit ein fokussiertes Bild.

Filter kombinieren und präzisieren

Für wiederholbare Analysen kombiniere ich Filter mit -a logisch verknüpft. So erhalte ich nur Einträge, die alle Bedingungen erfüllen. Beispiele:

  • lsof -a -p 1234 -d cwd,txt,mem – nur Arbeitsverzeichnis, Binärdatei und geladene Libraries eines Prozesses.
  • lsof -a -iTCP -sTCP:ESTABLISHED -p 1234 – nur etablierte TCP-Verbindungen einer PID.
  • lsof -a -u www-data +d /var/www – Dateien unterhalb von /var/www, die Prozesse des Users www-data offen halten.

Mit -d filtere ich nach Deskriptoren (Zahlen oder Namen wie cwd, mem). -U bringt mir gezielt Unix-Domain-Sockets in die Ausgabe, wenn ich lokale IPC-Probleme untersuchen will. So verringere ich Rauschen und sehe genau das, was zur Frage passt.

Prozesse und Benutzer schnell zuordnen

Wenn ich einen Dienstnamen kenne, liefert lsof -c nginx alle offenen Dateien des Webservers inklusive Libraries, Konfigurationen und Sockets. Für eine eindeutige Analyse arbeite ich häufig mit der PID: lsof -p 1234 zeigt sämtliche Handles eines konkreten Prozesses. Benutzerbezogene Prüfungen erledige ich mit lsof -u mysql oder einem anderen Account, um geöffnete Ressourcen eines Dienstkontos sichtbar zu machen. In längeren Analysen ergänze ich die Prozesssicht mit Prozess-Accounting und sehe so, wie oft und wie lange Programme Ressourcen nutzen. Diese Kombination aus Prozess-, Benutzer- und Activity-Sicht bringt mich bei kniffligen Phänomenen zügig zur Ursache.

Spezialfälle: gelöschte Dateien, Logrotate und Platzfresser

Wenn Plattenplatz „fehlt“, finde ich die Ursache oft mit lsof +L1: Es listet Dateien, die bereits gelöscht sind, aber von Prozessen noch offen gehalten werden. Typisch sind rotierte Logs, große temporäre Dateien oder Debug-Dumps. Statt die Partition hektisch zu vergrößern, beende ich gezielt die angezeigten PIDs oder sende das übliche Signal zum Reload. Für Logdienste nutze ich bevorzugt einen sauberen Reload des jeweiligen Service, damit Deskriptoren neu geöffnet werden. Notlösungen wie truncate oder direktes Entfernen ohne Prozessneustart verschieben das Problem nur.

Bei langen Datenstreams prüfe ich zusätzlich die Spalte SIZE/OFF (je nach Build sichtbar), um zu erkennen, ob ein Prozess an einem sehr großen Offset hängt. Das erklärt, warum ein Handle so viel Speicherplatz belegt, obwohl die Datei als gelöscht markiert ist.

Typische Fehlerszenarien systematisch lösen

Gesperrte Dateien entferne ich, nachdem lsof mir den verantwortlichen Prozess gezeigt hat. Statt planlos Dienste zu stoppen, beende ich gezielt die PID oder starte genau diesen Dienst neu. Portkonflikte löse ich mit lsof -i:<port>, sehe die bindende PID und passe danach Port, Service oder Firewall an. Wenn ein Prozess hängt, prüfe ich seine offenen Deskriptoren mit lsof -p <PID> und erkenne, ob er auf eine Datei, Pipe oder einen Socket wartet. Für Tiefenanalysen ergänze ich die Sicht mit strace gezielt, um Systemaufrufe live zu beobachten. So löse ich wiederkehrende Störungen verlässlich und dokumentiere die fixen Schritte für künftige Incidents.

Container und Namespaces berücksichtigen

In containerisierten Setups (z. B. mit eigenen Netzwerk-Namespaces) erklärt lsof mir Unstimmigkeiten zwischen Host und Container. Ich rufe lsof entweder direkt im Container auf oder betrete vom Host aus den Namespace des Zielprozesses. So erkenne ich, warum ein Port im Container im Zustand LISTEN ist, auf dem Host aber „frei“ wirkt: Sie liegen in unterschiedlichen Namespaces. Ähnlich verfahre ich mit Mount-Namespaces: Bind-Mounts und Overlay-Dateisysteme tauchen in der Spalte NAME mit ihren realen Pfaden auf und helfen, falsch gesetzte Volumes zu finden. Ich ordne offene Deskriptoren zusätzlich per Benutzer und Cgroup, wenn ich Services über Supervisoren oder Orchestrierungslösungen steuere.

Netzwerk-Analyse mit lsof -i

Mit lsof -i erfasse ich aktive Verbindungen und lausche ich auf belegte Ports. Filter wie lsof -iTCP -sTCP:LISTEN listen gezielt Dienste im LISTEN-Zustand. Für einzelne Protokolle arbeite ich mit lsof -iUDP oder spezifischen Ports wie lsof -i:25 für Mail-Server. Ich prüfe außerdem, ob eine PID mehrere Sockets geöffnet hält, was auf Leaks oder Endlosschleifen hinweisen kann. In Security-Prüfungen vergleiche ich erwartete Services mit der Ausgabe und erkenne fremde oder vergessene Dienste. Diese Netzwerksicht spart Zeit, weil ich nicht mehrere Tools parallel abfragen muss und alles an einer Stelle sehe.

Netzwerk-Details vertiefen

Für besonders gezielte Abfragen nutze ich die Adress- und Portsyntax von -i: Ich schränke auf Quell- oder Zieladressen ein (lsof [email protected]) oder kombiniere Adresse und Port (lsof [email protected]:443). Mit -sTCP:ESTABLISHED sehe ich produktive Sessions, während -sTCP:LISTEN nur Listener ausgibt. UDP-Analysen setze ich ein, um Dienste mit vielen kurzlebigen Sockets sichtbar zu machen (DNS, Syslog, NTP). Ich prüfe außerdem, ob Prozesse mehr als nötig im Netzwerk exponiert sind (z. B. Listener auf 0.0.0.0 statt lokalem Interface). Das reduziert späteren Hardening-Aufwand.

Tabellen-Überblick: Häufige Optionen

Ich nutze wenige Kernoptionen sehr regelmäßig und erweitere sie je nach Szenario. Die folgende Tabelle bündelt die wichtigsten Schalter mit kurzer Erläuterung und einem Beispiel. So finde ich schneller die passende Form und spare mir lange Hilfeausgaben. Ich wende diese Optionen modular an und bleibe dadurch flexibel. Wer diese Grundmenge beherrscht, löst viele Aufgaben mit einem einzigen Aufruf.

Option Zweck Beispiel
-i Netzwerkverbindungen und belegte Ports zeigen lsof -i:443
-c NAME Nach Prozessnamen filtern (Prefix-Match) lsof -c nginx
-p PID Alle offenen Dateien einer PID lsof -p 1234
-u USER Offene Ressourcen eines Benutzers lsof -u mysql
+d DIR Nur das angegebene Verzeichnis lsof +d /var/log
+D DIR Rekursiv durch das Verzeichnis lsof +D /var/log
-nP Kein DNS- und Port-Name-Lookup (schneller) lsof -nP -i
-t Nur PIDs ausgeben (skriptfreundlich) lsof -t -i:80
+L1 Gelöschte, aber noch offene Dateien anzeigen lsof +L1

Ich nutze -t häufig, um PIDs direkt in Skripte zu übergeben, etwa an kill oder systemctl. Mit +L1 finde ich Prozesse, die gelöschte Dateien weiter offen halten und damit Speicherplatz blockieren. In Kombination mit -r (wiederholen) beobachte ich Veränderungen in kurzen Abständen. Wer schrittweise testet, vermeidet Fehlinterpretationen und arbeitet konsistent. So bleibt die Diagnose reproduzierbar und messbar klar.

Ausgabe effizient weiterverarbeiten

Ich formatiere die Ausgabe direkt weiter, damit ich Ergebnisse schneller nutze. Mit lsof -t -i:80 | xargs -r kill -TERM beende ich etwa alle Prozesse, die Port 80 belegen. Für Reports greife ich auf lsof -nP -i | grep LISTEN zurück und filtere gezielt Zustände. Auch awk hilft: lsof -nP | awk '{print $1,$2,$3,$9}' reduziert die Sicht auf Name, PID, User, Pfad. Ich dokumentiere funktionierende Einzeiler und spare mir spätere Suche nach passenden Mustern. Kleine Helfer wie watch 'lsof -nP -i:443' zeigen Veränderungen live und führen schneller zur Entscheidung.

Automatisierung und parsebare Ausgabe

Für wiederkehrende Prüfungen nutze ich die maschinenlesbare Form von lsof mit -F. Ich wähle nur die Felder, die ich brauche (z. B. Prozess, Befehl, Benutzer, FD, Name) und parse sie stabil weiter. Beispiele:

  • lsof -Fn -Fp -Fc -Fu -t -i:443 – minimalistische Felder für Skripte, die nur PIDs oder Namen benötigen.
  • lsof -Fpcun -a -iTCP -sTCP:LISTEN – Listener erfassen und gezielt aufbereiten.

Mit -r 2 erzeuge ich eine „Live“-Ansicht alle zwei Sekunden und vergleiche Snapshots. In Pipelines führe ich Änderungen zusammen (sort, uniq, diff), um neue oder verschwindende Handles zu erkennen. Timeouts plane ich bewusst ein, damit Abfragen unter hoher Last nicht hängen bleiben und Monitoring-Jobs sauber enden.

Best Practices und Sicherheitsaspekte

Ich starte Analysen mit minimalen Rechten und erhöhe nur dann auf root, wenn mir Berechtigungen fehlen. So reduziere ich Risiken und halte Logs klar. Ich prüfe regelmäßige Scans mit lsof -i gegen meine erwarteten Dienste, um ungewöhnliche Listener oder Verbindungen zu erkennen. Verdächtige PIDs untersuche ich anschließend gezielt über Dateien, Libraries und Sockets. In Wartungsfenstern sorge ich dafür, dass keine gelöschten, aber noch offenen Dateien Platz verschwenden. Wer Sicherheit ernst nimmt, integriert lsof in Checklisten und reagiert auf Anomalien mit festen Schritten.

Häufige Stolpersteine und saubere Lösungen

  • Nicht alle Einträge sichtbar: Ohne Root fehlen mir oft Prozesse anderer Nutzer oder Kernel-nahe Handles. Ich nutze gezielt sudo.
  • Langsame Ausgabe: Ich deaktiviere Auflösungen mit -nP, verzichte auf Rekursion und schränke mit -a hart ein.
  • +D zu teuer: Rekursive Verzeichnisläufe können riesig sein. Ich beginne mit +d oder konkreten Pfaden und erweitere erst bei Bedarf.
  • Port belegt, Prozess unklar: Ich kombiniere lsof -i:<port> -nP mit -t für die PID und gehe über lsof -p <PID> tiefer.
  • „Freier“ Platz fehlt: lsof +L1 findet offene, aber gelöschte Dateien. Danach Prozess gezielt neu starten oder beenden.
  • Container/Namespaces: Ich prüfe die Abfrage im passenden Namespace, sonst sehe ich falsche Listener oder übersehe offene Dateien.

Performance und Grenzen verstehen

Auf sehr großen Systemen kostet eine komplette lsof-Aufnahme Zeit und erzeugt spürbare Last. Ich setze daher Filter früh an und schalte mit -nP alle Auflösungen ab. Bei massiven Handle-Zahlen prüfe ich parallel die File-Descriptor-Limits und hebe sie falls nötig an. Skripte sollten Timeouts einplanen und mit -t nur PIDs weiterreichen, um Datenmengen klein zu halten. Ich dokumentiere Ausnahmen und baue wiederkehrende Prüfungen in Automatisierungen ein. So bleibt die Diagnose auch unter Last zuverlässig und klar beherrschbar.

Praxis-Workflow: Von Symptom zur Ursache

Ich starte mit der Frage: Geht es um Datei, Prozess oder Port? Danach wähle ich den passenden Einstieg, etwa lsof /pfad/zur/datei, lsof -p <PID> oder lsof -i:<port>. Ich prüfe USER, FD, TYPE und NAME und halte fest, was erwartbar wirkt und was überrascht. Dann handle ich: Prozess neu starten, Konfiguration anpassen, Limit heben oder Port freigeben. Bei Unsicherheit fixiere ich den Zustand, sichere Logs und wiederhole die Messung nach der Änderung. Dieser Ablauf hält mich fokussiert und liefert eine saubere Beweiskette.

Checkliste: schnelle Rezepte für den Alltag

  • Wer blockiert die Datei? lsof /pfad/zur/datei – PID ablesen, Prozess gezielt neu starten oder beenden.
  • Welcher Dienst belegt den Port? lsof -nP -i:<port> – Konflikt auflösen, Port oder Bind-Adresse anpassen.
  • Wohin verschwindet der Plattenplatz? lsof +L1 – offene, gelöschte Dateien finden, beteiligte PIDs neu starten.
  • Hängt der Prozess an I/O? lsof -p <PID> – auf Pipes, Sockets oder Dateien achten; bei Bedarf mit strace ergänzen.
  • Welche Listener laufen wirklich? lsof -nP -iTCP -sTCP:LISTEN – mit Erwartungsliste abgleichen.
  • Welche Ressourcen nutzt ein Dienstkonto? lsof -u <user> – Auffälligkeiten pro Account erkennen.

Kurzfassung für den Alltag

lsof zeigt mir, wer welche Datei, welches Verzeichnis oder welchen Port blockiert. Mit -c, -p, -u, +d/+D und -i grenze ich die Sicht schnell ein. Ich löse gesperrte Dateien, finde Portkonflikte und entdecke ungewöhnliche Verbindungen. In Kombination mit -nP arbeite ich zügig und halte die Ausgabe überschaubar. Für tiefergehende Analysen ergänze ich Tools, dokumentiere funktionierende Einzeiler und baue wiederkehrende Checks in Automatisierungen ein. So bleibt die Diagnose mit lsof direkt, sicher und messbar effektiv.

Aktuelle Artikel