Как да използвате командата lsof на Linux

Ако всичко в Linux е файл, трябва да има нещо повече от файлове на твърдия ви диск. Този урок ще ви покаже как да използвате lsof, за да видите всички други устройства и процеси, които се обработват като файлове.

В Linux всичко е файл

Често цитираната фраза, че всичко в Linux е файл, е някак вярна. Файлът е колекция от байтове. Когато се четат в програма или се изпращат на принтер, изглежда, че генерират поток от байтове. Когато им се пише, те приемат поток от байтове.

Много други системни компоненти приемат или генерират потоци от байтове, като клавиатури, сокетни връзки, принтери и комуникационни процеси. Тъй като те или приемат, генерират или приемат и генерират потоци от байтове, тези устройства могат да се обработват — на много ниско ниво — сякаш са файлове.

Тази концепция за дизайн опрости внедряването на операционната система Unix. Това означаваше, че може да се създаде малък набор от манипулатори, инструменти и API за обработка на широк спектър от различни ресурси.

Данните и програмните файлове, които се намират на вашия твърд диск, са обикновени стари файлове на файловата система. Можем да използваме командата ls, за да ги изброим и да разберем някои подробности за тях.

Как да разберем за всички други процеси и устройства, които се третират като файлове? Използваме командата lsof. Това изброява отворените файлове в системата. Тоест, той изброява всичко, което се обработва, сякаш е файл.

Командването lsof

Много от процесите или устройствата, за които lsof може да докладва, принадлежат на root или са стартирани от root, така че ще трябва да използвате командата sudo с lsof.

И тъй като този списък ще бъде много дълъг, ние ще го изведем по-малко.

sudo lsof | less

Преди да се появи изходът lsof, потребителите на GNOME могат да видят предупредително съобщение в прозореца на терминала.

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.

lsof се опитва да обработи всички монтирани файлови системи. Това предупредително съобщение се издига, защото lsof е срещнал a Виртуална файлова система GNOME (GVFS). Това е специален случай на a файлова система в потребителското пространство (ПРЕДПАЗИТЕЛ). Той действа като мост между GNOME, неговите API и ядрото. Никой — дори root — няма достъп до една от тези файлови системи, освен собственика, който я е монтирал (в този случай GNOME). Можете да игнорирате това предупреждение.

Резултатът от lsof е много широк. Най-левите колони са:

  Как да настроите Resilio Sync сървър на Linux

Най-десните колони са:

Колоните lsof

Всички колони не се отнасят за всеки тип отворен файл. Нормално е някои от тях да са празни.

Команда: Името на командата, свързана с процеса, който е отворил файла.
PID: Идентификационен номер на процеса на процеса, който е отворил файла.
TID: Задача (нишка) Идентификационен номер. Празна колона означава, че не е задача; това е процес.
Потребител: Потребителско идентификатор или име на потребителя, на когото принадлежи процесът, или потребителския идентификатор или вход на лицето, което притежава директорията в /proc, където lsof намира информация за процеса.
FD: Показва файловия дескриптор на файла. Файловите дескриптори са описани по-долу.
Тип: тип възел, свързан с файла. Типовете бележки са описани по-долу.
Устройство: Съдържа или номерата на устройствата, разделени със запетаи, за специален символ, специален блок, обикновен файл, директория или NFS файл, или референтен адрес на ядрото, който идентифицира файла. Може също да показва основния адрес или името на устройството на сокет устройство за Linux AX.25.
Размер/Изкл.: Показва размера на файла или отместването на файла в байтове.
Възел: Показва номера на възела на локален файл или номера на inode на NFS файл в хоста на сървъра или типа интернет протокол. Може да показва STR за поток или IRQ или номер на inode на сокет устройство на Linux AX.25.
Име: Показва името на точката на монтиране и файловата система, на която се намира файлът.

FD колоната

Файловият дескриптор в колоната FD може да бъде една от многото опции; man страницата избройте ги всички.

Записът в колоната на FD може да бъде съставен от три части: файлов дескриптор, символ за режим и символ за заключване. Някои често срещани файлови дескриптори са:

cwd: Текуща работна директория.
err: грешка в информацията за FD (вижте колоната ИМЕ).
ltx: Текст на споделена библиотека (код и данни).
m86: DOS обединяване на картографиран файл.
mem: Файл, съпоставен с памет.
mmap: устройство, картографирано в паметта.
pd: Родителска директория.
rtd: Основна директория.
txt: Текст на програмата (код и данни)
Число, представляващо файлов дескриптор.

Знакът на режима може да бъде един от следните:

r: Достъп за четене.
w: Достъп за запис.
u: Достъп за четене и запис.
‘ ‘: Знак за интервал, ако режимът е неизвестен и няма символ за заключване.
–: Режимът е неизвестен и има символ за заключване.

Знакът за заключване може да бъде един от:

r: Прочетете заключване на част от файла.
R: Прочетете заключването на целия файл.
w: Заключване на запис върху част от файла.
W: Напишете заключване на целия файл.
u: Заключване за четене и запис с произволна дължина.
U: Неизвестен тип заключване.
„ “: Знак за интервал. Без заключване.

Колона ТИП

Има над 70 записа която може да се появи в колоната ТИП. Някои често срещани записи, които ще видите, са:

REG: Редовен файл на файловата система.
DIR: Указател.
FIFO: Първият дошъл, първи излязъл.
CHR: Специален файл за символи.
BLK: Блокиране на специален файл.
INET: Интернет сокет.
unix: UNIX домейн сокет

Вижте процеси, които са отворили файл

За да видите процесите, които са отворили определен файл, предоставете името на файла като параметър на lsof. Например, за да видите процесите, които са отворили kern.log файл, използвайте тази команда:

sudo lsof /var/log/kern.log

lsof отговаря, като показва единичния процес, rsyslogd, който е стартиран от потребителския syslog.

  Как да проверите здравето на твърдия диск в Linux

Вижте всички файлове, отворени от директория

За да видите файловете, които са били отворени от директория, и процесите, които са ги отворили, предайте директорията на lsof като параметър. Трябва да използвате опцията +D (директория).

За да видите всички файлове, които са отворени в директорията /var/log/, използвайте тази команда:

sudo lsof +D /var/log/

lsof отговаря със списък на всички отворени файлове в тази директория.

За да видите всички файлове, които са били отворени от /home директорията, използвайте следната команда:

sudo lsof +D /home

Показват се файловете, отворени от /home директория. Имайте предвид, че с по-кратки описания в някои от колоните, целият списък е по-тесен.

Списък на файлове, отворени от процес

За да видите файловете, които са били отворени от определен процес, използвайте опцията -c (команда). Имайте предвид, че можете да предоставите повече от една дума за търсене на lsof наведнъж.

sudo lsof -c ssh -c init

lsof предоставя списък на файловете, които са били отворени от някой от процесите, предоставени в командния ред.

Вижте Файлове, отворени от потребител

За да ограничите показването до файловете, които са били отворени от конкретен потребител, използвайте опцията -u (потребител). В този пример ще разгледаме файловете, които са били отворени от процеси, които са собственост или са стартирани от името на Mary.

sudo lsof -u mary

Всички изброени файлове са отворени от името на потребителя Mary. Това включва файлове, които са били отворени от средата на работния плот, например, или просто в резултат на влизане на Мери.

С изключение на файловете, отворени от потребител

За да изключите файловете, които са били отворени от потребител, използвайте оператора ^. Изключването на потребители от списъка улеснява намирането на информацията, която ви интересува. Трябва да използвате опцията -u, както преди, и да добавите знака ^ в началото на името на потребителя.

sudo lsof +D /home -u ^mary

Този път списъкът за директорията /home не включва нито един от файловете, които са били отворени от потребителя Mary.

Списък на файлове, отворени от процес

За да изброите файловете, които са били отворени от конкретен процес, използвайте опцията -p (процес) и предоставете идентификатора на процеса като параметър.

sudo lsof - p 4610

Всички файлове, които са били отворени от предоставения от вас идентификатор на процеса, са изброени за вас.

Изброяване на идентификатори на процеси, които са отворили файл

За да видите идентификаторите на процесите за процесите, които са отворили конкретен файл, използвайте опцията -t (кратко) и посочете името на файла в командния ред.

sudo lsof -t /usr/share/mime/mime.cache

Идентификаторите на процесите се показват в прост списък.

Използвайте търсения И и ИЛИ

Нека изброим файловете, отворени от потребителя Mary, които са свързани със SSH процесите. Знаем, че можем да предоставим повече от един елемент за търсене в командния ред, така че това трябва да е лесно.

sudo lsof -u mary -c ssh

Сега нека разгледаме изхода от lsof. Това не изглежда правилно; има записи в изхода, които са стартирани от root.

Не това очаквахме. Какво стана?

Когато предоставите няколко думи за търсене, lsof ще върне всеки файл, който съответства на първата дума за търсене или на втората дума за търсене и т.н. С други думи, той извършва търсене ИЛИ.

  Как да играете Outlast на Linux

За да накарате lsof да извърши търсене И, използвайте опцията -a (и). Това означава, че единствените файлове, които ще бъдат изброени, ще бъдат тези, които съответстват на първата дума за търсене, на втората дума за търсене и т.н.

Нека опитаме отново и използваме опцията -a.

sudo lsof -u mary -c ssh -a

Сега всеки файл в списъка е този, който е отворен от или от името на Мери и е свързан с командата SSH.

Автоматично опресняване на дисплея

Можем да използваме опцията +|-r (повтаряне), за да поставим lsof в режим на повторение. Опцията за повторение може да се приложи по два начина, +r или -r. Трябва също да добавим броя секунди, които искаме lsof да изчака, преди да обнови дисплея.

Използването на опцията за повторение и в двата формата кара lsof да показва резултатите както обикновено, но добавя пунктирана линия в долната част на дисплея. Той изчаква броя секунди, предоставен в командния ред, и след това опреснява дисплея с нов набор от резултати.

С опцията -r това ще продължи, докато не натиснете Ctrl+C. С формата +r той ще продължи, докато няма резултати за показване или докато не натиснете Ctrl+C.

sudo lsof -u mary -c ssh -a -r5

Обърнете внимание на пунктираната линия в долната част на списъка. Това разделя всяко ново показване на данни, когато изходът се обнови.

Показване на файлове, свързани с интернет връзки

Опцията -i (интернет) ви позволява да видите файловете, отворени от процеси, свързани с мрежови и интернет връзки.

lsof -i

Показват се всички файлове, отворени от мрежови и интернет връзки.

Показване на файлове, свързани с интернет връзки по ID на процес

За да видите файловете, отворени от интернет връзки, които са свързани с конкретен идентификатор на процес, добавете опцията -p и опцията -a.

Тук търсим файлове, отворени чрез интернет или мрежова връзка, чрез процес с идентификатор 606.

sudo lsof -i -a -p 606

Показват се всички файлове, отворени от процес ID 606, които са свързани с интернет или мрежови връзки.

Показване на файлове, свързани с интернет връзки и команди

Можем да използваме опцията -c (команда), за да търсим файлове, отворени от конкретни процеси. За да търсите файлове, които са били отворени от интернет или мрежови връзки, свързани с ssh процеса, използвайте следната команда:

lsof -i -a -c ssh

Всички файлове, отворени поради ssh процесите, са изброени в изхода.

Показване на файлове, свързани с интернет връзки и портове

Можем да направим lsof отчет за файловете, които са били отворени чрез интернет или мрежови връзки на конкретен порт. За да направите това, използваме знака :, последван от номера на порта.

Тук молим lsof да изброи файловете, които са били отворени от мрежови или интернет връзки чрез порт 22.

lsof -i :22

Всички изброени файлове бяха отворени от процеси, свързани с порт 22 (който е портът по подразбиране за SSH връзки).

Показване на файлове, свързани с интернет връзки и протоколи

Можем да поискаме от lsof да покаже файловете, които са били отворени от процеси, свързани с мрежови и интернет връзки, които използват специфичен протокол. Можем да избираме между TCP, UDP и SMTP. Нека използваме TCP протокола и да видим какво получаваме.

sudo lsof -i tcp

Единствените изброени файлове са тези, отворени от процеси, които използват TCP протокола.

Надраскахме само повърхността

Това е добро заземяване в някои често срещани случаи на използване на lsof, но има много повече от това. Колко повече може да се прецени от факта, че страницата на man е дълга над 2800 реда.

Командата lsof може да се използва за проникване все по-дълбоко в слоевете от отворени файлове и псевдофайлове. Предоставихме скицна карта; атласът е вътре man страницата.