Одни люди ищут - причины, другие - возможности, выигрывают последние

Полезные Unix утилиты. lsof.

Перевод: A Unix Utility You Should Know About: lsof
Автор: Peteris Krumins

Это третий пост из цикла статей о Unix и Linux утилитах о которых стоило бы знать. В этой статье я расскажу Вам о полезной утилите lsof. Если netcat был назван Швейцарским армейским ножем для сетевых соединений, то lsof можно назвать Швейцарским ножем для Unix отладки.

Lsof очень близко следует философии Unix. Он выполняет одну единственную задачу, но делает это превосходно — он предоставляет информацию о файлах открытых процессами. Открытый файл может быть обычным файлом, директорией, сетевым файлом NFS, специальным блочным файлом, специальным символьным файлом, динамической библиотекой, обычным конвейером, именованным конвейером, символической ссылкой, потоковым сокетом, Интернет сокетом, сокетом UNIX домена, и многим другим. С тех пор как в Unix все что угодно - это файл, Вы можете себе представить насколько сподручным должен быть lsof!

Для того, что-бы проникнуться циклом статей о Unix утилитах, посмотрите первый пост о pipe viewer.

Как использовать 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

Как установить lsof?

Lsof уже предустановлена на большинстве Unix систем. Если в Вашей системе ее нет, попробуйте установить ее с исходных кодов.

BSD поддерживает собственную аналогичную утилиту, называемую fstat.

Полная документация для lsof содержится в man lsof, либо Вы можете вызвать lsof -h для получения небольшой шпаргалки.

Удачи в работе с lsof!

14 комментариев на статью:
Ответить
Обязательные поля помечены *