Поиск по сайту:

Как использовать команду Linux lsof


Если все в Linux является файлом, это должно быть нечто большее, чем просто файлы на вашем жестком диске. В этом руководстве показано, как использовать lsof для просмотра всех других устройств и процессов, которые обрабатываются как файлы.

В Linux все является файлом

Часто цитируемая фраза о том, что все в Linux является файлом, отчасти верна. Файл — это набор байтов. Когда они считываются в программу или отправляются на принтер, создается впечатление, что они генерируют поток байтов. Когда они записываются, они принимают поток байтов.

Многие другие системные компоненты принимают или генерируют потоки байтов, такие как клавиатуры, сокеты, принтеры и коммуникационные процессы. Поскольку они либо принимают, генерируют, либо принимают и генерируют потоки байтов, с этими устройствами можно обращаться — на очень низком уровне — как с файлами.

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

Файлы данных и программы, которые находятся на вашем жестком диске, представляют собой старые файлы файловой системы. Мы можем использовать команду ls, чтобы вывести их список и узнать о них некоторые подробности.

Как узнать обо всех других процессах и устройствах, которые рассматриваются как файлы? Мы используем команду lsof. Это список открытых файлов в системе. То есть он перечисляет все, что обрабатывается, как если бы это был файл.

Команда lsof

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

И поскольку этот листинг будет очень длинным, мы собираемся передать его через less.

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 обнаружил виртуальную файловую систему GNOME (GVFS). Это частный случай файловой системы в пространстве пользователя (FUSE). Он действует как мост между GNOME, его API и ядром. Никто — даже root — не может получить доступ к одной из этих файловых систем, кроме владельца, который ее смонтировал (в данном случае GNOME). Вы можете игнорировать это предупреждение.

Вывод из lsof очень широк. Крайние левые столбцы:

Крайние правые столбцы:

Столбцы lsof

Все столбцы не применяются ко всем типам открытых файлов. Это нормально, что некоторые из них пусты.

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

Колонка ФД

Дескриптор файла в столбце FD может быть одним из многих вариантов; справочная страница перечисляет их все.

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

  • cwd: текущий рабочий каталог.
  • ошибка: ошибка информации о FD (см. столбец NAME).
  • ltx: текст общей библиотеки (код и данные).
  • m86: сопоставленный файл DOS Merge.
  • mem: файл с отображением памяти.
  • mmap: устройство с отображением памяти.
  • pd: родительский каталог.
  • rtd: корневой каталог.
  • txt: текст программы (код и данные)
  • Число, представляющее файловый дескриптор.

Символ режима может быть одним из следующих:

  • r: доступ для чтения.
  • w: доступ для записи.
  • u: доступ для чтения и записи.
  • ‘ ‘: символ пробела, если режим неизвестен и нет символа блокировки.
  • : режим неизвестен и есть символ блокировки.

Символ блокировки может быть одним из:

  • r: блокировка чтения части файла.
  • R: блокировка чтения всего файла.
  • w: блокировка записи части файла.
  • W: блокировка записи всего файла.
  • u: блокировка чтения и записи любой длины.
  • U: неизвестный тип блокировки.
  • ‘ ‘: символ пробела. Нет замка.

Столбец ТИП

В столбце TYPE может отображаться более 70 записей. Некоторые общие записи, которые вы увидите:

  • REG: обычный файл файловой системы.
  • КАТАЛОГ: каталог.
  • FIFO: первый пришел, первый ушел.
  • CHR: специальный файл символов.
  • BLK: заблокировать специальный файл.
  • INET: Интернет-сокет.
  • unix: сокет домена UNIX

Просмотр процессов, открывших файл

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

sudo lsof /var/log/kern.log

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

Просмотреть все файлы, открытые из каталога

Чтобы увидеть файлы, которые были открыты из каталога, и процессы, которые их открыли, передайте каталог в 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 (user). В этом примере мы рассмотрим файлы, открытые процессами, которые принадлежат или запущены от имени Мэри.

sudo lsof -u mary

Все перечисленные файлы были открыты от имени пользователя Мэри. Сюда входят файлы, которые были открыты, например, в среде рабочего стола или просто в результате того, что Мэри вошла в систему.

Исключение файлов, открытых пользователем

Чтобы исключить файлы, открытые пользователем, используйте оператор ^ . Исключение пользователей из списка упрощает поиск интересующей вас информации. Вы должны использовать параметр -u, как и раньше, и добавить символ ^ в начало имя пользователя.

sudo lsof +D /home -u ^mary

На этот раз список для каталога /home не включает файлы, открытые пользователем Мэри.

Список файлов, открытых процессом

Чтобы вывести список файлов, открытых определенным процессом, используйте параметр -p (процесс) и укажите идентификатор процесса в качестве параметра.

sudo lsof - p 4610

Для вас перечислены все файлы, которые были открыты с помощью указанного вами идентификатора процесса.

Список идентификаторов процессов, открывших файл

Чтобы просмотреть идентификаторы процессов, открывших определенный файл, используйте параметр -t (краткий) и укажите имя файла в командной строке.

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

Идентификаторы процессов отображаются в виде простого списка.

Используйте поиск по И и ИЛИ

Давайте перечислим файлы, открытые пользователем Мэри, которые связаны с процессами SSH. Мы знаем, что можем предоставить более одного элемента поиска в командной строке, так что это должно быть легко.

sudo lsof -u mary -c ssh

Теперь давайте посмотрим на вывод lsof. Это выглядит неправильно; в выводе есть записи, которые были запущены пользователем root.

Это не то, чего мы ожидали. Что случилось?

Если вы укажете несколько условий поиска, lsof вернет любой файл, который соответствует первому условию поиска или второму условию поиска и так далее. Другими словами, он выполняет поиск по ИЛИ.

Чтобы заставить 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 можно использовать для еще более глубокого изучения слоев открытых файлов и псевдофайлов. Мы предоставили карту-схему; Атлас находится на странице руководства.

RELATED: Best Linux Laptops for Developers and Enthusiasts