Як використовувати команду 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). Ви можете проігнорувати це попередження.

  Як грати в Spelunky на Linux

Вихід з lsof дуже широкий. Крайні ліві стовпці:

Крайні праві стовпці:

Колонки lsof

Усі стовпці не застосовуються до кожного типу відкритих файлів. Це нормально, коли деякі з них залишаються пустими.

Команда: назва команди, пов’язаної з процесом, який відкрив файл.
PID: Ідентифікаційний номер процесу, який відкрив файл.
TID: Завдання (потік) Ідентифікаційний номер. Порожній стовпець означає, що це не завдання; це процес.
Користувач: ідентифікатор користувача або ім’я користувача, якому належить процес, або ідентифікатор користувача чи логін особи, яка володіє каталогом у /proc, де lsof знаходить інформацію про процес.
FD: Показує дескриптор файлу. Дескриптори файлів описані нижче.
Тип: тип вузла, пов’язаного з файлом. Типи нотаток описані нижче.
Пристрій: містить або номери пристроїв, розділені комами, для спеціального символу, спеціального блоку, звичайного файлу, каталогу або файлу NFS, або довідкову адресу ядра, яка ідентифікує файл. Він також може показувати базову адресу або назву пристрою сокетного пристрою Linux AX.25.
Size/Off: Показує розмір файлу або зміщення файлу в байтах.
Вузол: Показує номер вузла локального файлу або номер інода файлу NFS на хості сервера або тип Інтернет-протоколу. Він може відображати STR для потоку або IRQ або номер інода пристрою сокету Linux AX.25.
Ім’я: Показує назву точки монтування та файлової системи, на якій знаходиться файл.

Колонка FD

Дескриптор файлу в стовпці FD може бути одним із багатьох варіантів; сторінку man перерахуйте їх усіх.

Запис стовпця FD може складатися з трьох частин: дескриптора файлу, символу режиму та символу блокування. Деякі поширені дескриптори файлів:

cwd: Поточний робочий каталог.
err: помилка інформації FD (див. стовпець NAME).
ltx: текст спільної бібліотеки (код і дані).
m86: DOS Merge зіставлений файл.
mem: файл із відображенням пам’яті.
mmap: пристрій з відображенням пам’яті.
pd: батьківський каталог.
rtd: Кореневий каталог.
txt: текст програми (код і дані)
Число, що представляє дескриптор файлу.

Символ режиму може бути одним із наступних:

r: Доступ для читання.
w: доступ до запису.
u: доступ для читання та запису.
‘ ‘: символ пробілу, якщо режим невідомий і немає символу блокування.
–: Режим невідомий, є символ блокування.

Символ блокування може бути одним із:

r: Блокування читання частини файлу.
R: Прочитати блокування на весь файл.
w: блокування запису на частину файлу.
W: Напишіть блокування на весь файл.
u: читання та запис блокування будь-якої довжини.
U: Невідомий тип замка.
‘ ‘: пробіл. Без замка.

Стовпець TYPE

Існує понад 70 записів які можуть відображатися в стовпці TYPE. Деякі поширені записи, які ви побачите:

REG: Звичайний файл файлової системи.
DIR: Довідник.
FIFO: перший прийшов першим вийшов.
CHR: спеціальний файл символів.
BLK: блокувати спеціальний файл.
INET: Інтернет-роз’єм.
unix: доменний сокет UNIX

Див. Процеси, які відкрили файл

Щоб побачити процеси, які відкрили певний файл, укажіть ім’я файлу як параметр для lsof. Наприклад, щоб побачити процеси, які відкрили файл kern.log, скористайтеся цією командою:

sudo lsof /var/log/kern.log

lsof відповідає, показуючи єдиний процес, rsyslogd, який був запущений системним журналом користувача.

  Як редагувати файл Hosts в 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 поверне будь-який файл, який відповідає першому пошуковому терміну чи другому пошуковому терміну тощо. Іншими словами, він виконує пошук АБО.

  Як встановити редактор зображень Gimp на 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

Відображаються всі файли, відкриті мережею та підключенням до Інтернету.

Відображення файлів, пов’язаних із підключеннями до Інтернету, за ідентифікатором процесу

Щоб побачити файли, відкриті підключенням до Інтернету, які пов’язані з певним ідентифікатором процесу, додайте параметри -p і -a.

Тут ми шукаємо файли, відкриті через Інтернет або мережеве підключення, за допомогою процесу з ідентифікатором 606.

sudo lsof -i -a -p 606

Відображаються всі файли, відкриті за ідентифікатором процесу 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, але це набагато більше, ніж це. Наскільки більше, можна судити за тим фактом, що сторінка довідки має понад 2800 рядків.

Команду lsof можна використовувати, щоб дедалі глибше проникнути в шари відкритих файлів і псевдофайлів. Ми надали ескізну карту; атлас в сторінку man.