Использование утилиты lsof в примерах

Имя утилиты LSOF является аббревиатурой от List Of Opened Files, и предназначена она, как следует из названия, для отображения открытых файлов различными процессами и/или пользователями.

Если утилиты в системе нет — установим её.

Будучи запущенной без дополнительных опций — утилита выведет информацию обо всех запущенных процессах и всех открытых ими файлах. Опции рассмотрим ниже.

Информация предоставляется в виде колонок, в которых отображается информация:

  • COMMAND   — имя процесса;
  • PID — его Process ID;
  • USER — имя пользователя, запустившего процесс;
  • FD — номер файлового дескриптора, либо обозначение типа:
  • cwd — текущий рабочий каталог;
  • ltx — текст разделяемой библиотеки;
  • mem — файл, загруженный в память (memory-mapped file), чаще всего – библиотека,
  • mmap — memory-mapped device;
  • pd — родительский каталог;
  • rtd — корневой каталог;
  • txt – текст программы (код и данные);
    Номер файлового дескриптора дополняется символом, указывающим режим, в котором файл был открыт:
  • r — файл открыт для чтения;
  • w – файл открыт для записи;
  • u — файл открыт для чтения и для записи;
  • пробел – режим доступа неизвестен и файл не блокирован;
  • ‘-’ — режим доступа неизвестен, но на файл установлена блокировка.
    В последнем случае за дефисом следует еще один символ, определяющий тип блокировки.
  • TYPE — тип открытого файла, обозначающиеся:
    REG — обычный файл,
    DIR — каталог,
    BLK — файл блочного устройства,
    CHR — файл символьного устройства,
    LINK — файл символической ссылки,
    INET – Internet-сокет, UNIX – доменный сокет UNIX;
  • DEVICE — устройство, на котором открыт данный файл;
  • SIZE/OFF — размер файла в байтах;
  • NODE — номер индексного дескриптора (inode);
  • NAME — собственно, имя самого файла и путь к нему.

Приведённое описание сравнительно краткое, больше информации можно найти в man lsof.

Примеры использования
Отобразить список процессов/пользователей, использующих в данный момент файл /usr/sbin/sshd:

Можно указать несколько файлов и/или каталогов, разделив их пробелом:

Отобразить список процессов и пользователей, использующих каталог /home/user/:

Что бы отобразить и все подкаталоги — используйте ключ +D:

Отобразить файлы, открытые процессом screen:

Тут надо отметить, что опция -c учитывает заданное имя «по маске». Т.е. результат будет включать в себя процессы, в имени которых содержится строка screen.

Как и выводом информации о файлах, можно использовать несколько значений:

Для более точного указания процесса — можно указать PID процесса:

Можно задать несколько PID, разделив их запятыми (без пробелов):

Наиболее полезная возможность — отобразить файлы, открытые пользователем user:

Что бы вывести всё, кроме пользователя user — используйте комбинацию ^:

Этот же способ исключения можно использовать и для всех других опций.

Тут так же можно использовать несколько имён и/или UID-ов, разделённых запятой:

Где 0 — это UID пользователя root.

Кроме того, lsof может отобразить активные сетевые включения, аналогично утилите netstat, для этого выполняем:

В кололнке NAME так же указывается состояние соединения — LISTEN (готов к приёму соединения), ESTABLISHED (установлено).

Можно задать более точные параметры для вывода информации в формате [46][protocol][@hostname|hostaddr][:service|port].

  • 4 и/или 6 — версия протокола IP (IPV4/IPV6);
  • protocol — либо TCP, либо UDP (либо ничего);
  • hostname — имя хоста;
  • hostaddr — числовой адрес;
  • service — имя интересующего сервиса, например — smtp, или список таких сервисов;
  • port — номер порта или список таких номеров.

Например, отобразить сервисы, прослушивающие порт 22 и/или уже установленные соединения на этом порту:

Либо — по имени сервиса:

Отобразить активные подключения с адреса 192.168.1.100:

Либо — скомбинировать все эти ключи:

Можно отобразить, например, только те процессы и файлы, у которых в колонке FD указан тип «mem«:

Полезная опция -t — вывести только PID-ы процессов. Например — отобразить активные PID пользователя user:

Эту комбинацию удобно использовать вместе с другими командами. Например — «убить» все сетевые процессы:

Или — убить все сетевые процессы пользователя user:

Тут необходимо остановиться подробнее на опции -a.

По-умолчанию, при использовании нескольких опций lsof выведет информацию о всех попадающих под эти опции процессах, т.е. используется логическое ИЛИ.

Например:

В такой комбинации будет отображена информация о файлах, открытых процессом с PID 1205, а так же — процессы пользователя user.

Если же необходимо указать четкое значение «опция 1 И опция 2» — используется ключ -a.

Например, вывести информацию о файле /usr/sbin/sshd, который открыт пользователем user:

Ещё одна полезная опция утилиты lsof — ключ -r, который выполняет запрос циклически, через заданный в секундах промежуток времени.

Например — отобразить все активные сетевые соединения пользователя user и обновлять информацию каждые 10 секунд (обратите внимание, что тут тоже используется ключ -a для уточнения отображаемой информации:

Вам может также понравиться...