Der ultimative Linux-lsof-Leitfaden – Praxis-Tipps von Portkonflikten bis zur Freigabe gelöschter Dateien

Übersicht

Probleme wie „Portkonflikte“ oder „Festplattenspeicher, der trotz Löschens nicht freigegeben wird“, die beim Betrieb von Linux-Systemen auftreten, lassen sich mit dem Befehl lsof sofort lösen. In diesem Artikel behandeln wir wichtige praxisnahe Techniken zur Anwendung von lsof in der Linux-Umgebung, in der alles als Datei verwaltet wird. Schritt für Schritt lernen Sie das unverzichtbare Troubleshooting-Know-how für Systemadministratoren kennen – von der Port-Rückverfolgung bis zum Lösen von Dateisperren.

Grundlegende Überprüfung mit lsof und Ermitteln geöffneter Dateien bestimmter Benutzer/Prozesse

Um zu überprüfen, ob der Befehl lsof auf dem System installiert ist, und das Paket zu installieren, falls es fehlt, führen Sie den Befehl command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof) aus.

command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof)

Führen Sie den Befehl lsof -v aus, um die installierte Version und Build-Informationen des lsof-Befehls zu überprüfen.
⚙️ [Wichtige Optionen]

-u : Zeigt Dateien und Prozesse an, die von einem bestimmten Benutzerkonto geöffnet wurden.
-c : Filtert nach Dateien, die von Prozessen geöffnet wurden, deren Name mit dem angegebenen Begriff beginnt.
-p : Überprüft die Liste der Dateien, die von einer bestimmten Prozess-ID (PID) geöffnet wurden.
-i : Ermittelt Netzwerk-Sockets und Prozesse, die bestimmte Ports verwenden.
+D : Sucht rekursiv nach geöffneten Dateien im angegebenen Verzeichnis und dessen Unterpfaden.
-t : Gibt ausschließlich Prozess-IDs (PIDs) zeilenweise aus, ideal zur Verwendung in Skripten.

lsof -v

Um ein Testverzeichnis und eine Beispieldatei für die lsof-Übung vorzubereiten, führen Sie den Befehl mkdir -p /tmp/lsof_lab && echo '테스트 파일 내용' > /tmp/lsof_lab/sample.txt aus.

mkdir -p /tmp/lsof_lab && echo ‘테스트 파일 내용’ > /tmp/lsof_lab/sample.txt

Führen Sie den Befehl tail -f /tmp/lsof_lab/sample.txt & aus, um die erstellte Beispieldatei im Hintergrund offenzuhalten und zu überwachen.

tail -f /tmp/lsof_lab/sample.txt &

Der Befehl lsof -u $(whoami) | head -n 15 ruft die ersten 15 Zeilen der Dateien ab, die von den Prozessen des aktuell angemeldeten Benutzers belegt sind.
Sie können detaillierte Informationen über die vom aktuellen Benutzer geöffneten Dateien einsehen, darunter grundlegende Systembibliotheken und Binärdateien.

lsof -u $(whoami) | head -n 15

Der Befehl lsof -c tail durchsucht und listet Dateien sowie Bibliotheken auf, die von Prozessen mit dem Namen tail geöffnet wurden.
Damit lässt sich nachvollziehen, welche Dateideskriptoren und Shared Libraries der im Hintergrund ausgeführte tail-Befehl referenziert.

lsof -c tail

Führen Sie den Befehl killall tail 2>/dev/null || true aus, um den im Hintergrund laufenden tail-Prozess nach Abschluss der Übung sicher zu beenden und aufzuräumen.

killall tail 2>/dev/null || true

Überprüfung von Netzwerkports und Behebung von Prozesskonflikten

Um die Umgebung für die Portprüfung und das Troubleshooting von Prozesskonflikten einzurichten, prüfen Sie, ob python3 auf dem System installiert ist, und installieren Sie das Paket, falls erforderlich.

command -v python3 >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y python3)

Starten Sie einen einfachen Webserver im Hintergrund auf Port 8080, um die Netzwerkport-Belegung zu testen.

python3 -m http.server 8080 >/dev/null 2>&1 &

Warten Sie 1 Sekunde, bis der im Hintergrund gestartete Webserver-Prozess ordnungsgemäß an Port 8080 gebunden ist.

sleep 1

Der Befehl lsof -i :8080 ermittelt den Prozess, der den Port 8080 verwendet.
Anhand der Ausgabe lässt sich erkennen, dass der python3-Prozess mit der PID 371 auf Port 8080 im Status LISTEN lauscht.

lsof -i :8080

Der Befehl lsof -i -P -n | head -n 15 gibt die Netzwerk-Sockets des Systems schnell in numerischer Form aus, ohne Portnummern und IP-Adressen aufzulösen.
Da Reverse-DNS-Lookups und Portnamens-Zuordnungen übersprungen werden, lässt sich die Portbelegung ohne Verzögerungen ermitteln.

lsof -i -P -n | head -n 15

Der Befehl lsof -i TCP:8080 -sTCP:LISTEN filtert gezielt nach Verbindungen auf Port 8080 mit dem TCP-Protokoll im Zustand LISTEN.
Dies ist nützlich, um unnötige Sitzungsverbindungen auszuschließen und genau den Daemon-Prozess zu identifizieren, der auf eingehende Verbindungen an diesem Port wartet.

lsof -i TCP:8080 -sTCP:LISTEN

Nach Abschluss der Übung beenden Sie den Webserver-Hintergrundprozess, der den TCP-Port 8080 belegte, um die Systemressourcen wieder freizugeben.

fuser -k 8080/tcp 2>/dev/null || kill $(lsof -t -i :8080) 2>/dev/null || true

Aufspüren bestimmter Verzeichnisse und Dateien, die das Unmounten blockieren (Device Busy)

Erstellen Sie ein Übungsverzeichnis und wechseln Sie dorthin, um die Belegung eines Verzeichnisses und eine Blockierung beim Unmounten nachzustellen.

mkdir -p /tmp/mount_test && cd /tmp/mount_test

Führen Sie den Befehl echo '작업 중인 파일' > active_work.log aus, um eine Protokolldatei zu erstellen, auf die der Prozess zugreifen soll.

echo ‘작업 중인 파일’ > active_work.log

Führen Sie im Hintergrund einen sleep-Prozess aus, der die erstellte Datei über die Standardeingabe referenziert und dauerhaft geöffnet hält.

sleep 30 < active_work.log &

Wechseln Sie in das Home-Verzeichnis, um den Status von außerhalb des belegten Verzeichnisses zu überprüfen.

cd /root || cd ~

Der Befehl lsof +D /tmp/mount_test verfolgt und listet alle geöffneten Dateien und Prozesse im angegebenen Verzeichnis sowie dessen Unterpfaden rekursiv auf.
Die Ausgabe zeigt, dass der sleep-Prozess mit PID 450 das Verzeichnis als aktuelles Arbeitsverzeichnis (cwd) verwendet und die Datei active_work.log im Lesemodus (0r) geöffnet hält, was die Ursache für das Verhindern des Unmountens ist.

lsof +D /tmp/mount_test

Beenden Sie nach Abschluss der Übung den sleep-Hintergrundprozess, der das Verzeichnis und die Datei belegt hat.

killall sleep 2>/dev/null || true

Löschen Sie das temporäre Testverzeichnis und alle darin enthaltenen Dateien, um die Systemressourcen zu bereinigen.

rm -rf /tmp/mount_test

Wiederherstellen und Bereinigen von gelöschten Geisterdateien (deleted), die Festplattenspeicher belegen

Erstellen Sie ein Übungsverzeichnis und eine 10 MB große Testdatei, um einen Speicherplatzverlust zu simulieren.

mkdir -p /tmp/leak_test && dd if=/dev/zero of=/tmp/leak_test/large.img bs=1M count=10 >/dev/null 2>&1

Starten Sie einen Prozess im Hintergrund, der das Datei-Handle für die erstellte Datei geöffnet hält.

tail -f /tmp/leak_test/large.img &

Löschen Sie die belegte Datei im Dateisystem, um den Zustand einer nicht freigegebenen Geisterdatei nachzustellen.

rm -f /tmp/leak_test/large.img

Der Befehl lsof | grep '(deleted)' | head -n 5' ruft eine Liste von Dateien ab, die im Dateisystem gelöscht wurden, aber von Prozessen weiterhin geöffnet gehalten werden und Speicherplatz belegen.
Damit lassen sich Geisterdateien und die zugehörigen Prozesse schnell ermitteln, wenn der Speicherplatz trotz Ausführung des rm-Befehls nicht freigegeben wird.

lsof | grep ‘(deleted)’ | head -n 5

Anhand der mit lsof -t ermittelten Prozess-ID wird die Liste der Dateideskriptoren im Verzeichnis /proc/$TARGET_PID/fd/ abgefragt.
Durch die direkte Identifizierung der Dateideskriptornummer, die der Prozess referenziert, kann der Speicherplatz freigegeben werden, ohne den Prozess neu starten zu müssen, oder bei Bedarf können die gelöschten Originaldaten über diesen Deskriptor wiederhergestellt werden.

TARGET_PID=$(lsof -t /tmp/leak_test/large.img 2>/dev/null | head -n 1) && [ -n “$TARGET_PID” ] && ls -l /proc/$TARGET_PID/fd/ || true

Beenden Sie nach Abschluss der Übung den Hintergrundprozess, der die Geisterdatei noch geöffnet hielt, um den Festplattenspeicher vollständig freizugeben.

killall tail 2>/dev/null || true

Löschen Sie das temporäre Testverzeichnis vollständig, um die Systemressourcen zu bereinigen.

rm -rf /tmp/leak_test

In diesem Leitfaden haben wir wichtige Praxistipps zur Verwendung des lsof-Befehls behandelt – von der Behebung von Portkonflikten bis hin zur Freigabe von Festplattenspeicher durch gelöschte Dateien.
Wir hoffen, dass diese Übersicht Ihnen beim Betrieb realer Server und bei der Fehlerbehebung hilfreich zur Seite steht.