lsof

Wyświetla otwarte pliki i gniazda sieciowe wraz z procesami, które ich używają.

lsof (LiSt Open Files) pokazuje, jakie pliki są aktualnie otwarte i który proces je trzyma. W Linuksie „plikiem” jest niemal wszystko: zwykłe pliki, katalogi, gniazda sieciowe, potoki, urządzenia. Dzięki temu lsof to scyzoryk admina — sprawdzisz nim, kto słucha na porcie 8080, czemu nie da się odmontować dysku, albo który proces wciąż trzyma skasowany log i zapycha ci dysk. Na większości systemów do pełnego podglądu wszystkich procesów potrzebujesz roota (sudo).

Składnia i najważniejsze opcje

Podstawowa składnia: lsof [opcje] [nazwa_pliku ...]

  • -i — pokazuje połączenia sieciowe; można zawęzić, np. -i :443, -i TCP, -i tcp@host:port.
  • -p PID — tylko pliki otwarte przez proces o danym PID-zie.
  • -u user — filtruje po właścicielu procesu (np. -u www-data).
  • -c nazwa — filtruje po nazwie polecenia/procesu (np. -c nginx).
  • -t — wypisuje wyłącznie same PID-y, idealne do potoków z kill.
  • -n — nie zamienia adresów IP na nazwy (szybciej, bez czekania na DNS).
  • -P — nie zamienia numerów portów na nazwy usług (zobaczysz 443 zamiast https).
  • +D katalog — rekurencyjnie pokazuje otwarte pliki w danym katalogu.

Przykłady użycia

  • sudo lsof -i :8080 — kto nasłuchuje lub trzyma połączenie na porcie 8080. Klasyk, gdy „adres już zajęty”.
  • sudo lsof -i -P -n — wszystkie połączenia sieciowe z surowymi numerami portów i IP, bez tłumaczenia na nazwy.
  • lsof -p 1234 — wszystkie pliki i gniazda otwarte przez proces 1234.
  • sudo lsof +D /var/log — co aktualnie trzyma pliki w /var/log (przydatne przy rotacji logów).
  • sudo kill -9 $(lsof -t -i :3000) — ubija proces blokujący port 3000 jednym strzałem.

Częste błędy i pułapki

Bez sudo zobaczysz tylko własne procesy — jeśli wynik wygląda podejrzanie pusto, dorzuć roota. Domyślnie wiele filtrów łączy się logicznym OR, więc lsof -u root -i pokaże pliki roota oraz wszystkie sieciowe; jeśli chcesz AND (i roota, i sieciowe), dodaj -a: lsof -a -u root -i. Bardzo częsty case: skasowany plik, który nadal zajmuje miejsce, bo proces go trzyma — szukaj w wynikach dopisku (deleted) i restartuj winowajcę, zamiast głowić się, czemu df nie zgadza się z du. Pamiętaj też, że lsof to migawka z jednej chwili — krótkie połączenia możesz przegapić. Na koniec: lsof nie jest standardem POSIX i bywa pominięty na minimalnych obrazach (kontenery), więc nie zawsze jest pod ręką.

Powiązane komendy: ss, netstat, fuser, ps, strace.