fuser

Identyfikuje (i opcjonalnie zabija) procesy korzystające z pliku, katalogu lub gniazda.

fuser odpowiada na pytanie, które dręczy każdego admina raz w tygodniu: który proces trzyma ten plik (albo port) i nie chce go puścić?. Narzędzie skanuje /proc i zwraca identyfikatory procesów (PID) korzystających z podanego pliku, katalogu, systemu plików albo gniazda sieciowego. Potrafi też te procesy od razu ubić, więc ratuje, gdy nie da się odmontować dysku z błędem „device is busy” albo gdy port 8080 zajmuje duch po poprzednim deployu.

Składnia i najważniejsze opcje

Podstawowa forma to fuser [opcje] nazwa, gdzie nazwa to ścieżka do pliku, katalogu lub specyfikacja gniazda.

  • -v — tryb gadatliwy, wynik w stylu ps: kolumny PID, USER, ACCESS i COMMAND. Najczęściej używana flaga.
  • -k — zabija procesy korzystające z zasobu (domyślnie sygnał SIGKILL).
  • -i — pyta o potwierdzenie przed każdym zabiciem; działa tylko razem z -k.
  • -m — traktuje argument jako system plików lub urządzenie blokowe i wypisuje wszystkie procesy używające czegokolwiek na tym montowaniu.
  • -n PRZESTRZEN — wybiera przestrzeń nazw: tcp, udp lub file (domyślnie). Tak sprawdza się porty.
  • -u — dopisuje nazwę właściciela procesu do każdego PID.
  • -SYGNAL — wysyła inny sygnał niż SIGKILL, np. -HUP albo -TERM; lista przez fuser -l.
  • -a — pokazuje też pliki, których nikt nie używa (przydatne przy wielu argumentach).

Przykłady użycia

  • fuser -v /var/log/syslog — pokazuje, kto trzyma otwarty plik logu, w czytelnej tabeli z nazwą procesu i użytkownikiem.
  • fuser -mv /mnt/dane — listuje wszystkie procesy korzystające z systemu plików zamontowanego w /mnt/dane; ratunek przed „target is busy” przy umount.
  • fuser -k -n tcp 8080 — zabija proces nasłuchujący na porcie TCP 8080. Klasyk po nieudanym restarcie aplikacji.
  • fuser -ki -n tcp 443 — to samo, ale z pytaniem o potwierdzenie dla każdego procesu, żeby nie ubić czegoś przez przypadek.
  • fuser -k -HUP /etc/nginx/nginx.conf — wysyła SIGHUP zamiast zabijać, np. żeby przeładować konfigurację procesu.

Częste błędy i pułapki

Najgroźniejsza pomyłka to odruchowe fuser -k bez -v i -i — SIGKILL nie daje procesowi szansy na sprzątnięcie, więc baza danych czy edytor mogą zostawić uszkodzone pliki. Najpierw zobacz, co trzymasz, potem strzelaj.

Druga pułapka: składnia portów. Samo fuser 8080 szuka pliku o nazwie 8080, a nie portu. Musisz dodać -n tcp (lub starszy zapis 8080/tcp). Do podejrzenia cudzych procesów i portów uprzywilejowanych potrzebujesz root albo sudo — inaczej zobaczysz tylko swoje.

Uwaga na różnice systemowe: na Linuksie fuser pochodzi z pakietu psmisc, a na BSD/macOS to inny program z innymi flagami (skrypty nie są przenośne). W trybie -v typ dostępu czytasz z kolumny ACCESS (litery: f otwarty plik, r katalog główny, c katalog bieżący, e plik wykonywalny, m mapowany w pamięci).

Powiązane komendy: lsof (bogatszy, pokazuje więcej szczegółów), ps, kill, ss oraz netstat do podglądu portów.