Ну что, братья-айтишники, сегодня говорим про команду lsof. Решил ее рассмотреть довольно спонтанно, т.к. также спонтанно она мне пригодилась)
Как мы знаем, в linux немалую роль играют файлы. Многие говорят, что все в linux - файл. В своей основе, утилита lsof (list open files) позволяет просматривать список открытых файлов и выступает в роли интерфейса для мониторинга виртуальной файловой системы proc.
Подробнее про файловую систему proc:
Данная файловая система состоит из набора каталогов и файлов, смонтированных в одноименной директории. Называется она виртуальной потому, что фактически не находятся на диске и заполняется ядром на лету. Нужна она, в основном, для того, чтобы на стороне пользователя (через файлы) просматривать информацию о ядре и его структурах.
Говоря простым языком, анализ VFS (virtual file system) proc позволяет ответить на следующие вопросы:
1. Сколько процессов запущено в системе и кто ими владеет?
2. Какие файлы открыты процессом?
3. Какие файлы в данный момент заблокированы и какие процессы удерживают эти блокировки?
4. Какие сокеты используются в системе?
Разбор вывода команды lsof:
Давайте начнем с простого - без дополнительных флагов запустим утилиту и проанализируем ее вывод:
$ lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 253,0 4096 2 /
init 1 root txt REG 253,0 145180 147164 /sbin/init
init 1 root 4w FIFO 0,8 0t0 8449 pipe
...
В результате мы получаем пулл информации про активные утилиты и используемые ими ресурсы (файлы, каталоги, сокеты и т.д.).
Спектр возможных значений для каждого поля тут довольно широк, поэтому за детальной информацией предлагаю обратиться к мануалу.
Давайте на конкретном примере посмотрим, о чем нас проинформирует lsof:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
prog_wr 9957 xodefender 3w REG 253,0 46442 1445679 /home/xodefender/input.txt
1. COMMAND - название утилиты, которая использует ресурс .
2. PID - идентификатор процесса для программы prog_wr.
3. USER - имя пользователя, которому принадлежит процесс.
4. FD - поле, предоставляющее информацию о ресурсе, который использует процесс. Значение поля может состоять из нескольких частей. В случае принадлежности к зарезервированному типу, значениями могут быть: cwd, rtd, txt, mem и т.д.
Если же, как в данном случае, речь идет о ресурсе, к которому можно обратиться по локальному дескриптору, структура может быть следующей: порядковый номер дескриптора (3) + права доступа (w - открыт на запись).
5. TYPE - тип ресурса. В данном случае используется обычный файл (REG). Также, ресурсами могут быть: директории (DIR), каналы передачи данных (FIFO), сетевые сокеты (INET) и т.д.
6. DEVICE - номер устройства, к которому относится ресурс (в формате major:minor). Обычно, информация берется об устройствах из каталога dev.
7. SIZE/OFF - размер файла input.txt в байтах. Если размер ресурса получить не удается, значением поля будет его отступ в памяти.
8. NODE - номер ресурса в таблице индексного дескриптора "inode". В нашем случае, файл input.txt числится под номером 1445679 в общесистемной таблице.
9. NAME - имя ресурса, представленное абсолютным путем.
Примеры использования команды lsof:
Вот и мне эта программка пригодилась для того, чтобы понять, какие процессы используют интересующую меня динамическую библиотеку.
Если у вас уже есть подозрения и вы знаете PID процесса, можно воспользоваться флагом '-p', который отобразит информацию только для указанного процесса:
$ lsof -p 23708
vlc 23708 root mem REG 8,2 264888 2365462 /usr/lib64/vlc/plugins/codec/libomxil_plugin.so
Если же у вас 0 идей, можете прямо прописать путь к целевому ресурсу и утилита вам покажет все процессы, которые его используют:
$ lsof ./libomxil_plugin.so
vlc 23708 root mem REG 8,2 264888 2365462 ./libomxil_plugin.so