# lsof — offene Dateien und Netzwerk-Sockets aufspüren

> Praxis-Guide zu lsof: offene Dateien, Ports und Sockets aufspüren – wer lauscht, was blockiert ein unmount, welche gelöschte Datei frisst Plattenplatz.

Source: https://www.jpkc.com/db/cheatsheets/shell-system/lsof/

<!-- PROSE:intro -->
Unter Unix und Linux ist fast alles eine Datei – auch Netzwerkverbindungen, Pipes, Geräte und Verzeichnisse. `lsof` (List Open Files) macht genau diese offenen Dateien sichtbar und beantwortet damit Fragen, an denen andere Werkzeuge scheitern: Wer lauscht auf einem Port? Warum lässt sich ein Verzeichnis nicht aushängen? Welcher Prozess hält eine längst gelöschte Datei offen und frisst Plattenplatz? Dieser Guide führt dich von den Grundlagen bis zu kombinierten Filtern für den Alltag.
<!-- PROSE:intro:end -->

## Grundlagen

`lsof` — Listet alle offenen Dateien aller Prozesse auf. Sehr lange Ausgabe.

```bash
sudo lsof | head -50
```

`lsof -p PID` — Zeigt alle von einem bestimmten Prozess geöffneten Dateien.

```bash
lsof -p 1234
```

`lsof -c COMMAND` — Zeigt Dateien von Prozessen, deren Name mit COMMAND beginnt.

```bash
lsof -c nginx
```

`lsof -u USER` — Zeigt Dateien, die ein bestimmter Nutzer geöffnet hat.

```bash
lsof -u www-data
```

`lsof -u ^USER` — Zeigt Dateien, die NICHT von einem Nutzer geöffnet wurden (Nutzer ausschließen).

```bash
lsof -u ^root
```

`lsof +D DIRECTORY` — Zeigt alle offenen Dateien in einem Verzeichnis (rekursiv).

```bash
lsof +D /var/log
```

`lsof +d DIRECTORY` — Zeigt offene Dateien in einem Verzeichnis (nicht rekursiv).

```bash
lsof +d /tmp
```

`lsof FILE` — Zeigt, welche Prozesse eine bestimmte Datei geöffnet haben.

```bash
lsof /var/log/syslog
```

## Netzwerkverbindungen

`lsof -i` — Listet alle Netzwerkverbindungen auf (IPv4 und IPv6).

```bash
sudo lsof -i
```

`lsof -i :PORT` — Zeigt, welcher Prozess einen bestimmten Port nutzt.

```bash
sudo lsof -i :80
```

`lsof -i tcp` — Zeigt nur TCP-Verbindungen.

```bash
sudo lsof -i tcp
```

`lsof -i udp` — Zeigt nur UDP-Verbindungen.

```bash
sudo lsof -i udp
```

`lsof -i 4` — Zeigt nur IPv4-Verbindungen.

```bash
sudo lsof -i 4
```

`lsof -i 6` — Zeigt nur IPv6-Verbindungen.

```bash
sudo lsof -i 6
```

`lsof -i tcp:PORT` — Zeigt TCP-Verbindungen auf einem bestimmten Port.

```bash
sudo lsof -i tcp:443
```

`lsof -i @HOST` — Zeigt Verbindungen zu/von einem bestimmten Host.

```bash
sudo lsof -i @192.168.1.1
```

`lsof -i @HOST:PORT` — Zeigt Verbindungen zu einem bestimmten Host und Port.

```bash
sudo lsof -i @192.168.1.1:22
```

`lsof -i :PORT1-PORT2` — Zeigt Verbindungen über einen Portbereich.

```bash
sudo lsof -i :8000-9000
```

## Verbindungszustände

`lsof -i -sTCP:LISTEN` — Zeigt nur lauschende TCP-Sockets.

```bash
sudo lsof -i -sTCP:LISTEN
```

`lsof -i -sTCP:ESTABLISHED` — Zeigt nur aufgebaute TCP-Verbindungen.

```bash
sudo lsof -i -sTCP:ESTABLISHED
```

`lsof -i -sTCP:CLOSE_WAIT` — Zeigt Verbindungen im Zustand CLOSE_WAIT.

```bash
sudo lsof -i -sTCP:CLOSE_WAIT
```

`lsof -i -sTCP:TIME_WAIT` — Zeigt Verbindungen im Zustand TIME_WAIT.

```bash
sudo lsof -i -sTCP:TIME_WAIT
```

## Anzeigeoptionen

`lsof -n` — Numerische Ausgabe – löst keine Hostnamen auf. Schneller.

```bash
sudo lsof -i -n
```

`lsof -P` — Löst Portnummern nicht in Dienstnamen auf.

```bash
sudo lsof -i -P
```

`lsof -nP` — Komplett numerisch – weder Hostnamen noch Ports auflösen.

```bash
sudo lsof -i -nP
```

`lsof -t` — Knappe Ausgabe – nur PIDs. Praktisch für Skripte.

```bash
lsof -t -i :80
```

`lsof -r SECONDS` — Wiederholt die Auflistung alle N Sekunden (wie watch).

```bash
sudo lsof -i :80 -r 2
```

`lsof +r SECONDS` — Wiederholt, bis keine offenen Dateien mehr gefunden werden, dann Ende.

```bash
lsof +r 1 /path/to/file
```

## Filter kombinieren

`lsof -a -u USER -i` — UND-Verknüpfung: Netzwerkverbindungen eines bestimmten Nutzers. -a bedeutet UND.

```bash
sudo lsof -a -u www-data -i
```

`lsof -a -c COMMAND -i :PORT` — Dateien eines Kommandos UND auf einem bestimmten Port.

```bash
sudo lsof -a -c apache -i :80
```

`lsof -a -p PID -i` — Netzwerkverbindungen eines bestimmten Prozesses.

```bash
lsof -a -p 1234 -i
```

## Dateisystem & Geräte

`lsof +f -- /MOUNT` — Zeigt alle Prozesse, die Dateien auf einem eingehängten Dateisystem nutzen.

```bash
lsof +f -- /mnt/usb
```

`lsof /dev/DEVICE` — Zeigt Prozesse, die ein bestimmtes Gerät nutzen.

```bash
lsof /dev/sda1
```

`lsof -d FD` — Zeigt Dateien nach Dateideskriptor-Nummer.

```bash
lsof -d 0-2
```

`lsof +L1` — Zeigt Dateien mit Link-Zähler null (gelöscht, aber noch offen).

```bash
sudo lsof +L1
```

## Praxisbeispiele

`lsof -i -nP -sTCP:LISTEN` — Zeigt alle lauschenden Ports mit numerischen Adressen. Häufigster Einsatz.

```bash
sudo lsof -i -nP -sTCP:LISTEN
```

`kill -9 $(lsof -t -i :PORT)` — Beendet den Prozess, der einen bestimmten Port nutzt.

```bash
kill -9 $(lsof -t -i :8080)
```

`lsof +L1 | awk '{sum += $7} END {print sum/1024/1024 " MB"}'` — Berechnet den Plattenplatz gelöschter, aber noch offener Dateien.

```bash
sudo lsof +L1 | awk '{sum += $7} END {print sum/1024/1024 " MB"}'
```

`lsof -c java -a -i -nP` — Zeigt alle Netzwerkverbindungen von Java-Prozessen.

```bash
sudo lsof -c java -a -i -nP
```

`lsof -u USER -a +D /home/USER` — Zeigt alle Dateien, die ein Nutzer in seinem Home-Verzeichnis offen hat.

```bash
lsof -u jpk -a +D /home/jpk
```

`lsof -i @REMOTE_HOST -nP` — Findet alle Verbindungen zu einem bestimmten Remote-Host.

```bash
sudo lsof -i @10.0.0.5 -nP
```

<!-- PROSE:outro -->
## Fazit

`lsof` ist ein reines Lese-Kommando – es verändert nichts, sondern gibt nur Auskunft, und gehört damit zu den sichersten Diagnose-Werkzeugen überhaupt. Für die meisten Aufgaben reicht eine Handvoll Aufrufe: `lsof -i :<port>` zeigt, wer auf einem Port lauscht oder sich verbindet, `lsof -p <pid>` und `lsof -u <user>` grenzen auf Prozess oder Nutzer ein, und `lsof +D <verzeichnis>` verrät, welcher Prozess ein „device busy" beim Aushängen verursacht. Besonders wertvoll ist `lsof +L1`: Es findet gelöschte, aber noch offene Dateien, deren Speicher das System erst nach dem Schließen freigibt – die Brücke zu `df` und `du`, wenn die Platte voll ist, das Verzeichnis aber leer wirkt. Für Dateien fremder Prozesse brauchst du in der Regel `sudo`.

## Weiterführende Links

- [ubuntuusers-Wiki: lsof](https://wiki.ubuntuusers.de/lsof/) – deutschsprachige Einführung mit vielen Praxisbeispielen
- [Wikipedia: lsof](https://de.wikipedia.org/wiki/Lsof) – Hintergrund und Überblick zum Werkzeug
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [ps](https://www.jpkc.com/db/cheatsheets/shell-system/ps/) – laufende Prozesse und ihre PIDs anzeigen
- [kill](https://www.jpkc.com/db/cheatsheets/shell-system/kill/) – Prozesse über ihre PID beenden oder Signale senden
- [strace](https://www.jpkc.com/db/cheatsheets/shell-system/strace/) – Systemaufrufe eines Prozesses live mitverfolgen

