lsof
Утилита, служащая для вывода информации о том, какие файлы используются теми или иными процессами
Как использовать 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