lsof

Утилита, служащая для вывода информации о том, какие файлы используются теми или иными процессами

В этой статье я постараюсь преподнести функциональность lsof настолько, насколько позволяет мой опыт. Начнем с простого (что вероятно Вы уже знаете) и перейдем к сложному.

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

# lsof

Запустив lsof без каких-либо аргументов мы получим список всех открытых файлов всеми возможными процессами.

Посмотрим, кто использует файл.

# lsof /path/to/file

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

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

# lsof /path/to/file1 /path/to/file2

Рекурсивный поиск всех открытых файлов, начиная с указанной директории, выглядит вот так.

# lsof +D /usr/lib

С аргументом +D lsof ищет все файлы в указанной директории и всех поддиректориях.

Заметьте, что это будет работать медленнее чем с обычным grep:

# lsof | grep ‘/usr/lib’

Это медленнее потому что +D сперва ищет все файлы и только затем делает вывод.

Список всех файлов открытых пользователем.

# lsof -u pkrumins

Опция -u (думаю это user) ограничивает вывод файлов открытых пользователем pkrumins.

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

# lsof -u rms,root

Этот пример покажет список файлов открытых пользователями rms и root.

По другому это можно сделать указав параметр -u дважды:

# lsof -u rms -u root

Найти все файлы открытые программой.

# lsof -c apache

Параметр -c выбирает список файлов принадлежащих процессу, чье имя начинается с apache.

Итак, вместо запуска:

# lsof | grep foo

Вы можете использовать более короткую версию:

# lsof -c foo

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

# lsof -c apa

Эта команда выведет список всех файлов, открытых процессом начинающимся на apa.

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

# lsof -c apache -c python

Эта команда выведет список всех файлов, открытых процессами apache и python.

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

# lsof -u pkrumins -c apache

Опции Lsof могут комбинироваться. Действие по умолчанию между опциями определяется как ИЛИ. Это означает, что комбинация параметров -u pkrumins и -c apache выводит список файлов открытых пользователем pkrumins или процессом apache. Список всех файлов открытых пользователем И процессом.

# lsof -a -u pkrumins -c bash

Параметр -a. Комбинирует опции с условием И. Выводится список файлов открытых bash, который запущен пользователем pkrumins. Список всех файлов открытых всеми пользователями КРОМЕ root.

# lsof -u ^root

Заметьте, что символ ^ ставится до имени пользователя root. Этот трюк инвертирует совпадение для lsof на обратное, распечатывая все файлы пользователей отличных от root. Список всех файлов открытых процессом с определенным PID.

# lsof -p 1

Параметр -p (думаю это PID) фильтрует вывод отображая список файлов открытых программой с указанным id.

Помните, что Вы можете выбрать разичные PID’ы используя либо список разделяемый запятой, либо используя несколько аргументов -p:

# lsof -p 450,980,333

Выбирает процессы с PID 450, 980 и 333.

Список всех открытых фалов за ИСКЛЮЧЕНИЕМ процесса с указанным PID.

# lsof -p ^1

Здесь снова используется инвертный оператор ^. Он инвертирует список и не включает в него процессы с PID 1.

Список всех сетевых соединений.

# lsof -i

Lsof с опцией -i выводит список всех Интернет сокетов (TCP и UDP). Список всех TCP соединений.

# lsof -i tcp

Опция -i может иметь несколько различных параметров, один из них tcp. Опция tcp заставляет lsof выдавать список связанный только с TCP сокетами.

Список всех UDP соединений.

# lsof -i udp

Опция udp говорит lsof выводить список связанный только с UDP сокетами.

Кто использует этот порт.

# lsof -i :25

Опция :25 с -i заставляет lsof искать процессы использующие TCP или UDP с портом 25.

Вы также можете указать именованное название порта (смотрите /etc/services) вместо его номера:

# lsof -i :smtp

Найти, кто исопльзует данный UDP порт.

# lsof -i udp:53

Аналогично, найти, кто использует данный TCP порт:

# lsof -i tcp:80

Найти все сетевые действия пользователя.

# lsof -a -u hacker -i

Здесь опция -a комбинируется с -u и -i формируя список сетевых файлов используемых пользователем hacker.

Список всех файлов NFS (Network File System).

# lsof -N

Эту опцию легко запомнить, потому что -N это NFS.

Список всех файловых сокетов домена Unix.

# lsof -U

Эту опцию также легко запомнить, потому что -U это Unix.

Список всех файлов для процессов принадлежащих определенной группе id.

# lsof -g 1234

Групповые процессы используются для логической группировки процессов. Этот пример покажет список всех файлов открытых процессами принадлежащими к группе с PGID 1234.

Список всех файлов ассоциированных с указанным файловым дескриптором.

# lsof -d 2

Список всех файлов открытых файловым дескриптором с номером 2.

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

# lsof -d 0-2

Список всех файлов с файловыми дескрипторами 0, 1 и 2.

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

# lsof -d mem

Или txt программ загруженных и выполняемых в памяти:

# lsof -d txt

Выводит PID’ы процессов использующих какие-то ресурсы.

# lsof -t -i

Опция -t выводит только PID’ы процессов. Используя совместно с -i это позволяет выводить PID’ы всех процессов с сетевыми соединениями. Так можно легко убить все процессы использующие сеть:

# kill -9 `lsof -t -i`

Повторяющийся листинг файлов.

# lsof -r 1

Аргумент -r заставляет lsof повторять список файлов, до тех пор пока он не будет остановлен. Аргумент 1 говорит, что необходимо повторять листинг через каждую секунду. Эту опцию лучше всего комбинировать с поисковым запросом, производящим мониторинг сетевой пользовательской активности:

# lsof -r 1 -u john -i -a