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 zkill.-n— nie zamienia adresów IP na nazwy (szybciej, bez czekania na DNS).-P— nie zamienia numerów portów na nazwy usług (zobaczysz443zamiasthttps).+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.