Lsof – listowanie otwartych plików w linuxie
Cześć,
kontynuując temat zarządzania serwerami nie sposób nie wspomnieć o programie
lsof (czyli list open files)
Przydatne narzędzie podglądania listy otwartych plików oraz programów które ich używają. W sumie to tyle, zerknijmy na jakiś przykład może.
Polecenie to zazwyczaj zwraca sporo danych więc warto przerzucić output do less’a:
1 | lsof | less |
Stwórzmy sobie plik w katalogu domowym
1 | touch test.t |
i używając interaktywnej konsoli Python’a otwórzmy ten pliczek:
i zobaczmy jak widzi to lsof:
i od lewej idąc mamy nazwę procesu który trzyma uchwyt i jego ID. Potem nazwa użytkownika z którego chodzi proces. Kolumna z wartością „3r” to FD czyli file descriptor #3 a literka „r” oznacza że plik jest otwarty do odczytu (read). Tutaj może być kilka wartości np. mem, cwd, txt – oznacza to ogólnie w jaki sposób aplikacja otwierająca plik widzi go. Dalej mamy kolumnę TYPE i może ona przybrać takie wartości jak chociażby
1 2 3 4 | REG – Regular File DIR – Directory FIFO – First In First Out CHR – Character special file |
No i dalej to już tylko numery urządzenia którego plik dotyczy no i rozmiar. Na sam koniec info jakiego pliku to dotyczy.
To urządzenie które jest enigmatycznie przedstawione jako „8,2” to nic innego jak dysk, lista jest dostępna w repo linuxa: klik a nasza 8mka to:
1 2 3 4 5 6 7 8 9 10 | 8 block SCSI disk devices (0-15) 0 = /dev/sda First SCSI disk whole disk 16 = /dev/sdb Second SCSI disk whole disk 32 = /dev/sdc Third SCSI disk whole disk ... 240 = /dev/sdp Sixteenth SCSI disk whole disk Partitions are handled in the same way as for IDE disks (see major number 3) except that the limit on partitions is 15. |
co znaczy że dwójka, po przecinku, oznacza partycję.
Lsof ma przydane przełączniki, np:
pozwala zobaczyć pliki otwarte przez dany proces. Wziąłem proces którym otworzyłem wcześniej utworzony plik. Jak widać, trzyma on uchwyty nie tylko do mojego pliku.
podobnie zadziała przełącznik „-u” tylko będzie pokazywał rezultat dla usera:)
Co pozwala np. zabić wszystkie procesy konkretnego użytkownika:
1 | kill -9 `lsof -t -u mmazurek` |
Tak czy siak – fajne polecenie i dość istotne, bo jak wiadomo, wszystko w linuxie jest plikiem:)
Mateusz Mazurek