Список открытых файлов в каталогах
Вы можете использовать команду lsof для вывода списка всех открытых файлов в определенном каталоге. Команда ниже иллюстрирует это на простом, но практическом примере.
$ lsof +D Documents
$ sudo lsof +D ~/
Первая команда выводит список всех открытых файлов в каталоге Documents. Вторая команда выводит список всех открытых файлов в домашнем каталоге и его подкаталогах. Вторая команда будет работать даже без sudo, но покажет некоторые предупреждения в выводе.
Рекурсивный список открытых файлов в каталогах
Приведенная выше команда будет отображать только файлы, которые открыты в каталоге документов. Он не будет отображать открытые файлы в подкаталогах документов. К счастью, lsof предоставляет еще одну удобную опцию, чтобы включить это. Посмотрите на приведенный ниже пример для лучшего понимания этой опции.
$ lsof +d Documents
$ sudo lsof +d ~/
Эта команда отобразит все открытые файлы в каталоге Documents, а затем опустится в подкаталоги, если таковые имеются. Обратите внимание, что это может занять очень много времени, если Документы большие и имеют много подкаталогов.
Список открытых файлов на основе процесса
Ранее мы перечисляли все открытые файлы, используя их PID. Однако мы также можем распечатать список файлов, активных в данный момент, используя их имя процесса. Посмотрите на приведенный ниже пример и введите его в своем любимом эмуляторе терминала Linux, чтобы увидеть, как это работает.
$ lsof -c chrome
Эта команда выведет все открытые файлы, которые были созданы процессом chrome. Обратите внимание, что может быть несколько процессов, имена которых начинаются со строки chrome. Эта команда представит их всех в выводе.
Список ID родительского процесса (PPID)
Утилита lsof позволяет администраторам перечислять идентификационный номер родительского процесса (PPID) вместе с обычными полями вывода. Вам нужно будет передать опцию -R, чтобы включить это, как показано ниже.
$ lsof -R
$ lsof -p [PID HERE] -R
Первая команда выводит все текущие активные процессы вместе с информацией о PPID. Последняя команда берет номер PID и отображает PPID для этого процесса.
Список PID, которые открыли файл
Следующая команда перечисляет все идентификаторы процессов, которые открыли определенный файл. Здесь мы используем опцию -t, представленную ранее.
$ lsof -t /usr/share/mime/mime.cache
Поскольку опция -t предоставляет только PID, мы используем ее для получения ожидаемого результата. Эта команда выведет список всех идентификаторов процессов, которые открыли документ /usr/share/mime/mime.cache .
Список файлов на основе файловых дескрипторов
Мы можем дать команду lsof составить список открытых файлов на основе файловых дескрипторов. Следующая команда показывает, как найти все открытые в настоящее время файлы, для которых поле FD (дескриптор файла) установлено как cwd (текущий рабочий каталог).
$ lsof -d cwd
$ lsof -u xyz -d cwd -a
Первая команда выведет каждый открытый файл в текущем рабочем каталоге. Вторая команда выводит список файлов, которые принадлежат пользователю xyz. Для этого бита требуется опция -a , и команда не будет работать должным образом без этой опции.
Показать вывод для других программ
Команда lsof позволяет администраторам производить вывод для анализа с помощью внешних инструментов, таких как awk, Perl и язык программирования C. Вам нужно будет передать опцию -F вместе со списками символов для идентификации поля.
$ lsof -F
$ lsof -FucsS
Первая команда создает полезный вывод, который можно сохранить с помощью оператора перенаправления ( > ) и проанализировать позже. Во втором примере изменяется вывод для размещения дополнительных данных, таких как имя команды процесса, идентификатор пользователя, идентификация потока и размер.
Список неудачных предметов
Часто lsof не может найти некоторые элементы, запрошенные пользователем. Найти эти предметы довольно сложно, поскольку продукция lsof очень обширна. К счастью, опция -V позволяет lsof распечатывать эти элементы очень удобно.
$ lsof -V
$ lsof -c ssh -c http -V
$ lsof -p 12312312 -V
В первом примере будут перечислены все такие файлы, которые lsof не смог найти. Второй пример можно использовать для определения наличия каких-либо команд процесса, имена которых начинаются с ssh или http. Последний пример иллюстрирует использование -V для идентификаторов процессов.
Показать информацию о TCP / TPI
По умолчанию lsof предоставляет мало информации о соединениях TCP / TPI. Предоставляет только отчеты о состояниях соединения. Однако мы можем использовать опцию -T для включения дополнительных функций отчетности, как показано ниже.
$ lsof -i -Tq
$ lsof -i -Tqs
Первая команда покажет длину очереди (q) в своем выводе. Вторая команда покажет состояние соединения вместе с длиной очереди. По умолчанию это -Ts, и когда вы используете только -T , он отключит все отчеты TCP/TPI.
Отключить преобразование номера порта
Опция -P позволяет администраторам отключать преобразование номеров портов в имена при поиске сетевых файлов или сокетов Unix. Это может сэкономить значительное количество времени, когда таких файлов слишком много.
$ lsof -i -Tqs -P
Вы можете сравнить время, затрачиваемое этой командой, со временем, затраченным той же командой, но без опции -P . Для этой цели мы будем использовать стандартный инструмент Linux для терминала.
$ time lsof -i -Tqs
$ time lsof -i -Tqs -P
Время выполнения сокращается примерно до ⅙
Отключить преобразование имени хоста
Как и имена портов, мы также можем отключить преобразование имени хоста из сетевых номеров. Это также приведет к значительному увеличению производительности, как вы увидите. Команда time снова пригодится для доказательства этого.
$ lsof -i -n
На этот раз lsof не будет преобразовывать номера сетей в имена хостов. Используйте следующие команды, чтобы проверить изменение скорости выполнения.
$ time lsof -i
$ time lsof -i -n
$ time lsof -i -n -P
Включить режим повтора
Команда lsof в Linux предоставляет удобный режим повтора для мониторинга оперативных операций без выхода из консоли вывода. Посмотрите на приведенные ниже примеры, чтобы узнать это более подробно.
$ lsof -r 5 -i UDP
Этот команда будет выводить все текущие соединения UDP через каждые 5 секунд , пока вы не завершить команду, используя Ctrl + C. Вы также можете использовать опцию + r , которая автоматически завершит.
$ lsof +r 5 -i UDP
Список всех процессов, прослушивающих порты TCP
Мы можем перечислить все процессы, которые прослушивают порты TCP, используя утилиту lsof. Для этой задачи мы будем использовать несколько уже показанных параметров. Посмотрите на приведенный ниже пример, чтобы понять, как это работает.
$ lsof -nP -i TCP -s TCP:LISTEN
Эта команда отключает преобразование имен хостов и имен портов с помощью параметров -n и -P , которые объединяются вместе. Опция -s сообщает lsof, что нас интересуют только процессы, которые прослушивают порты TCP.
Список процессов на основе протоколов
Мы также можем определить конкретные протоколы, которые нас интересуют. Быстрый просмотр приведенных ниже команд поможет вам понять это гораздо лучше.
$ lsof -i TCP:https
$ lsof -i UDP:ntp
Первая команда показывает все файлы TCP, которые используют порт https, который по умолчанию равен 443. Последняя команда показывает все файлы UDP, которые используют порт NTP (сетевой протокол времени). Следующая команда отображает все такие файлы UDP, которые используют соединения IPv4.
$ lsof -i4 -a -i UDP:ntp