Полезные 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 показывает все процессы, которые используют данный файл каким-либо образом.
Вы можете указать несколько файлов, и получите все процессы, которые используют данные файлы:
Рекурсивный поиск всех открытых файлов, начиная с указанной директории, выглядит вот так.
С аргументом +D lsof ищет все файлы в указанной директории и всех поддиректориях.
Заметьте, что это будет работать медленнее чем с обычным grep:
Это медленнее потому что +D сперва ищет все файлы и только затем делает вывод.
Список всех файлов открытых пользователем.
Опция -u (думаю это user) ограничивает вывод файлов открытых пользователем pkrumins.
Вы можете использовать список разделенный запятой, если хотите узнать информацию сразу по нескольким пользователям:
Этот пример покажет список файлов открытых пользователями rms и root.
По другому это можно сделать указав параметр -u дважды:
Найти все файлы открытые программой.
Параметр -c выбирает список файлов принадлежащих процессу, чье имя начинается с apache.
Итак, вместо запуска:
Вы можете использовать более короткую версию:
Как правило, Вы можете определить только начальные буквы имени процесса, который вы хотите обследовать:
Эта команда выведет список всех файлов, открытых процессом начинающимся на apa.
Вы также можете указать несколько параметров -c для вывода файлов, открытых различными процессами:
Эта команда выведет список всех файлов, открытых процессами apache и python.
Список файлов открытых пользователем или процессом.
Опции Lsof могут комбинироваться. Действие по умолчанию между опциями определяется как ИЛИ. Это означает, что комбинация параметров -u pkrumins и -c apache выводит список файлов открытых пользователем pkrumins или процессом apache.
Список всех файлов открытых пользователем И процессом.
Параметр -a. Комбинирует опции с условием И. Выводится список файлов открытых bash, который запущен пользователем pkrumins.
Список всех файлов открытых всеми пользователями КРОМЕ root.
Заметьте, что символ ^ ставится до имени пользователя root. Этот трюк инвертирует совпадение для lsof на обратное, распечатывая все файлы пользователей отличных от root.
Список всех файлов открытых процессом с определенным PID.
Параметр -p (думаю это PID) фильтрует вывод отображая список файлов открытых программой с указанным id.
Помните, что Вы можете выбрать разичные PID’ы используя либо список разделяемый запятой, либо используя несколько аргументов -p:
Выбирает процессы с PID 450, 980 и 333.
Список всех открытых фалов за ИСКЛЮЧЕНИЕМ процесса с указанным PID.
Здесь снова используется инвертный оператор ^. Он инвертирует список и не включает в него процессы с PID 1.
Список всех сетевых соединений.
Lsof с опцией -i выводит список всех Интернет сокетов (TCP и UDP).
Список всех TCP соединений.
Опция -i может иметь несколько различных параметров, один из них tcp. Опция tcp заставляет lsof выдавать список связанный только с TCP сокетами.
Список всех UDP соединений.
Опция udp говорит lsof выводить список связанный только с UDP сокетами.
Кто использует этот порт.
Опция :25 с -i заставляет lsof искать процессы использующие TCP или UDP с портом 25.
Вы также можете указать именованное название порта (смотрите /etc/services) вместо его номера:
Найти, кто исопльзует данный UDP порт.
Аналогично, найти, кто использует данный TCP порт:
Найти все сетевые действия пользователя.
Здесь опция -a комбинируется с -u и -i формируя список сетевых файлов используемых пользователем hacker.
Список всех файлов NFS (Network File System).
Эту опцию легко запомнить, потому что -N это NFS.
Список всех файловых сокетов домена Unix.
Эту опцию также легко запомнить, потому что -U это Unix.
Список всех файлов для процессов принадлежащих определенной группе id.
Групповые процессы используются для логической группировки процессов. Этот пример покажет список всех файлов открытых процессами принадлежащими к группе с PGID 1234.
Список всех файлов ассоциированных с указанным файловым дескриптором.
Список всех файлов открытых файловым дескриптором с номером 2.
Вы можете задать интервал файловых дескрипторов:
Список всех файлов с файловыми дескрипторами 0, 1 и 2.
Несколько специальных значений, таких как mem, которые работают с файлами отображаемыми в память:
Или txt программ загруженных и выполняемых в памяти:
Выводит PID’ы процессов использующих какие-то ресурсы.
Опция -t выводит только PID’ы процессов. Используя совместно с -i это позволяет выводить PID’ы всех процессов с сетевыми соединениями. Так можно легко убить все процессы использующие сеть:
Повторяющийся листинг файлов.
Аргумент -r заставляет lsof повторять список файлов, до тех пор пока он не будет остановлен. Аргумент 1 говорит, что необходимо повторять листинг через каждую секунду. Эту опцию лучше всего комбинировать с поисковым запросом, производящим мониторинг сетевой пользовательской активности:
Как установить lsof?
Lsof уже предустановлена на большинстве Unix систем. Если в Вашей системе ее нет, попробуйте установить ее с исходных кодов.
BSD поддерживает собственную аналогичную утилиту, называемую fstat.
Полная документация для lsof содержится в man lsof, либо Вы можете вызвать lsof -h для получения небольшой шпаргалки.
Удачи в работе с lsof!