Narzędzie komendy „lsof” w Linuksie jest jednym z wielu wbudowanych narzędzi, które jest super przydatne do sprawdzania „listy otwartych plików”. Tak, termin „lsof” jest skrótem od zadania.
W systemie cały czas działa wiele procesów, które uzyskują dostęp do różnych plików systemu. Plikami tymi mogą być pliki dyskowe, skrypty, gniazda sieciowe, urządzenia, nazwane rury i inne. Używając „lsof”, możliwe jest wykonanie wielu rzeczy, takich jak debugowanie. Jest to również całkiem przydatne dla administratorów systemu, aby dowiedzieć się, do jakich plików mają dostęp poszczególne procesy. Jednym z najbardziej użytecznych scenariuszy, jakie znalazłem, jest sytuacja, gdy masz zamiar odmontować system plików, ale nadal jest on dostępny.
Bez dalszych ceregieli, zacznijmy od „lsof”! Zakładam, że twój obecny system UNIX/Linux ma już zainstalowany program „lsof”.
To zgłasza pełną ścieżkę polecenia, w tym przypadku „lsof”.
lsof -v
Zgłasza szczegółowe informacje o wersji polecenia „lsof”, w tym datę kompilacji binarnej, wersję kompilatora, flagi kompilatora i inne.
Podstawowe użycie „lsof”
Uruchamia „lsof” samodzielnie.
Zgłasza DUŻĄ listę wszystkich plików, do których system ma dostęp w momencie uruchomienia polecenia.
Choć wszystkie pola są zrozumiałe same przez się, większość osób myli się co do kolumn „FD” i „TYPE” i ich wartości. Sprawdźmy je.
FD: Skrót od „File Descriptor”. Pojawiają się następujące wartości.
- cwd: Bieżący katalog roboczy
- rtd: Katalog główny
- txt: Tekst programu (dane, kod i inne)
- mem: Plik mapowany w pamięci
- err: Błąd informacji FD
- mmap: Memory-mapped device
- ltx: Tekst biblioteki współdzielonej (dane i kod)
- m86: DOS Merge mapped file
Są też inne wartości, które zauważysz w kolumnie, jak „1u”, po którym następują wartości u, r, w, itd. Co one oznaczają?
- r: Dostęp do odczytu
- w: Dostęp do zapisu
- u: Dostęp do odczytu i zapisu
- – : Nieznany tryb i zawiera znak blokady
- ’ ’: Tryb jest nieznany i nie ma znaku blokady
TYPE: Opisuje typ pliku i jego identyfikację. Wartości są następujące.
- DIR: Directory
- CHR: Character-special file
- REG: Regular file
- FIFO: First in, first out
Otwarte pliki specyficzne dla użytkownika
Linux jest genialną platformą wieloużytkownikową. Wielu użytkowników może mieć dostęp do systemu w tym samym czasie i wykonywać operacje, do których mają uprawnienia.
Aby sprawdzić pliki, do których dostęp ma określony użytkownik, uruchom następujące polecenie.
Jednakże, aby sprawdzić użytkowników z wyższą rangą, „lsof” będzie potrzebował uprawnienia „superużytkownika”.
A co powiesz na sprawdzenie wszystkich poleceń i plików, do których ma dostęp dany użytkownik? Uruchom następujący.
Znowu, dla użytkowników z wyższą rangą, „lsof” będzie potrzebował przywileju „superużytkownika”.
Port-specific running processes
Aby dowiedzieć się o wszystkich procesach, które aktualnie używają danego portu, wywołaj „lsof” z flagą „-i”, a następnie z informacją o protokole i porcie.
:<usługa|port>
Na przykład, aby sprawdzić wszystkie programy mające obecnie dostęp do portu 80 przez protokół TCP/IP, wykonaj następujące polecenie.
Tej metody można również użyć do pokazania wszystkich procesów, które korzystają z portów w określonym zakresie, na przykład od 1 do 1000. Struktura polecenia jest podobna do poprzedniej, z odrobiną magii w części dotyczącej numeru portu.
Procesy specyficzne dla protokołów
Oto 2 przykłady pokazujące procesy, które aktualnie używają protokołów IPv4 i IPv6.
Listowanie połączeń sieciowych
Następujące polecenie wyświetli wszystkie połączenia sieciowe z bieżącego systemu.
Wykluczanie za pomocą ^
Tak, możemy wykluczyć konkretnego użytkownika, port, FD i inne za pomocą znaku „^”. Jedyne co musisz zrobić, to używać go z rozwagą, aby nie zepsuć całego wyjścia.
W tym przykładzie wykluczmy wszystkie procesy użytkownika „root”.
Istnieją inne sposoby użycia tego mechanizmu wykluczania z „lsof”, na przykład z flagami takimi jak „-c”, „-d” itp. Nie wszystkie flagi obsługują ten mechanizm. Dlatego zalecam wypróbowanie tej metody z dowolną flagą przed zaimplementowaniem jej do skryptów.
Wyszukiwanie PID
PID jest ważną właściwością każdego działającego procesu w systemie. Pozwala on na dokładniejsze przyporządkowanie do konkretnego procesu. Nazwa procesu nie jest całkiem pomocna w wielu sytuacjach, ponieważ ta sama binarka może tworzyć kopie samej siebie i wykonywać różne zadania równolegle.
Jeśli nie wiesz, jak uzyskać PID procesu, po prostu użyj „ps”, aby wyświetlić listę wszystkich uruchomionych procesów i przefiltrować wyjście za pomocą „grep” z nazwą procesu i/lub komendami.
Teraz wykonaj filtrowanie za pomocą „grep”.
Teraz sprawdź, do jakich plików ma dostęp ten PID.
Lista otwartych plików dla konkretnego urządzenia
Funkcjonalność „lsof” nie ogranicza się tylko do tych funkcji. Możesz również filtrować wynik działania „lsof” na podstawie urządzenia. W tym celu, polecenie będzie wyglądać coś takiego.
To polecenie jest bardzo przydatne, aby dowiedzieć się wszystkie uruchomione procesy z ich właścicielem informacje dostępu do określonego systemu plików. Jeśli masz problemy z odmontowaniem systemu plików, jest to najlepszy sposób, aby przejść.
Lista otwartych plików w katalogu
Podobnie do poprzedniego przykładu, wystarczy przekazać ścieżkę katalogu do „lsof”, aby dowiedzieć się, czy jakikolwiek proces ma do niego dostęp.
Uwaga: „lsof” będzie sprawdzał katalog rekursywnie, więc może to zająć trochę czasu.
Bonus: zakończ wszelką aktywność użytkownika
Bądź bardzo ostrożny z tą częścią, ponieważ może ona po prostu namieszać we wszystkim, co robi użytkownik. Następujące polecenie zabije wszystkie działające procesy użytkownika.
Podsumowanie
Funkcje „lsof” nie kończą się tylko tutaj. Te wymienione tutaj są tymi, które będą nam najbardziej potrzebne na co dzień. Istnieje wiele innych funkcji „lsof”, które mogą się przydać (oczywiście w szczególnych przypadkach).
Aby poznać wszystkie dostępne funkcje i ich zastosowanie, sprawdź strony man i info „lsof”.
Enjoy!
.