Использование lsof в Linux

Конспект в доработке

    Общие сведения

    Экран, клавиатура, принтер, мышь, сетевая карта, терминал, директория, диск, pipe, cокет, процесс, принимают и генерируют потоки байтов, они могут также как и файлы обрабатываться на низком уровне. Однако для просмотра информации, в отличии от обычных файлов которые хранятся на диске, используется утилита lsof (‘LiSt Open Files)

    lsof - утилита для вывода информации о том, какие файлы используются процессами
    Открытый файл может быть обычным файлом, каталогом, блочным специальным файлом, символьным специальным файлом, исполняемой текстовой ссылкой, библиотекой, потоком или сетью, рабочим файлом (интернет-сокет, файл NFS или доменный сокет UNIX)

    Опции

    -d s - Этот параметр определяет список файловых дескрипторов (FD), которые следует исключить из выходного списка или включить в него. Файловые дескрипторы указываются в наборе s, разделенном запятыми, например, `cwd,1,3", `^6,^2". (В наборе не должно быть пробелов.)


    +D D - Эта опция заставляет lsof выполнять поиск всех открытых экземпляров каталога D и всех файлов и каталогов, которые в нем содержатся, на полную глубину.
    Обработка параметра +D не приводит к переходу по символическим ссылкам в D, если не указан параметр -x или -xl. Также не выполняется поиск открытых файлов в точках монтирования файловой системы в подкаталогах D, если не указан параметр -x или -xf.
    lsof может обрабатывать этот параметр медленно и требовать для этого большого объема динамической памяти

    -D D Этот параметр определяет, как lsof использует файл кэша устройства. Подробности в официально документации

    +|-f сам по себе разъясняет, как следует интерпретировать аргументы имени пути. Если за ними следуют c, f, g, G или n в любой комбинации, это указывает на то, что перечисление информации о файловой структуре ядра должно быть включено (`+') или запрещено (`-').
    Если указано значение +f, все аргументы имени пути будут приниматься за имена файловых систем, и lsof будет жаловаться, если таковые не указаны
    Когда параметр -f указан сам по себе, все аргументы имени пути будут приниматься за простые файлы.
    Так, например, аргументы `-f -- /" направляют lsof на поиск открытых файлов с именем пути "/", а не всех открытых файлов в файловой системе "/" (root).
    Будьте внимательны и убедитесь, что +f и -f правильно завершены и за ними не следует символ (например, имени файла или файловой системы), который может быть использован в качестве параметра. Например, используйте `--" после +f и -f, как в этом примере:
    lsof +f -- /file/system/name
    Подробнее об +f смотри в man

    COMMAND — название процесса или команды, которая использует файл; PID — идентификатор процесса; TID - номер задачи (потока), если столбец пустой, значит это не задача(поток), а процесс TASKCMD - имя команды задачи USER — пользователь, которому принадлежит процесс; FD — дескриптор файла (например, cwd — текущий рабочий каталог, txt — исполняемый код, mem — отображенные в память файлов, rtd — корневой каталог); TYPE — тип файла или объекта файловой системы (например, REG — обычный файл, DIR — каталог, и другие); DEVICE — мажорный и минорный номера устройства, адрес для сокета, на котором находится файл; SIZE/OFF — размер файла или значение смещения в нем; NODE — номер индексного дескриптора (inode), номер узла, тип интернет протокола, STR для потока, IRQ или номер inod сокета unux; IRQ - Interrupt ReQuest - запрос на прерывание NAME — абсолютный путь к файлу, имя точки монтирования, если это обычный файл

    inod - индексный дескриптор — это структура данных в традиционных для ОС UNIX файловых системах (ФС), таких как UFS, ext4. В этой структуре хранится метаинформация о стандартных файлах, каталогах или других объектах файловой системы, кроме непосредственно данных и имени(материал из википедии)

    Файловые дескрипторы FD

    cwd - текущий рабочий каталог
    err - информация об ошибка в FD
    ltx - текст разделяемой библиотеки
    m86 - файл сопоставления с dos merge
    mem - файл с отображением в памяти
    mmap - устройство с отображением в памяти
    pd - родительский каталог
    rtd - корневой каталог
    txt - текст программы

    Символ режима

    r - чтение
    w - запись
    u - чтение и запись
    - - режим неизвестен и есть символ блокировки

    Символ блокировки

    r - блокировка на часть файла
    R - блокировка на весь файл
    w - блокировка записи на часть файла
    W - блокировка записи на весь файл
    u - блокировка чтения и записи любой длины
    U - неизвестный тип блокировки
    пробел - нет блокировки

    Type

    REG - обычный файл в системе
    DIR - директория
    FIFO - специальный файл FIFO (First In First Out)
    CHR - специальный символьный файл
    BLK - специальный блочный файл
    INET - интернет сокет
    unix - доменный сокет unix
    IPv4 - сокет
    IPv6 - сокет
    sock - сокет неизвестного домена
    DEL - указатель на удаленный файл
    LINK - файл символьной ссылки
    PIPE - для обмена данными между процессами

    Name

    NAME - это Имя точки монтирования в системе, имя специального или блочного устроойства
    Или локальный или удаленный интернет адрес сетевого файла при этом ip адрес может быть представлен в виде чисел или имен в зависимости от опций M n P
    ip-адрес:порт
    За адресом назначения может быть указано кол-во времени с момента отправки сообщения в пункт назначения а также состояние прослушивания
    NAME - адреса или bvz сокета домена UNIX + возможно устройство клонирования потока + имя пути объекта файловой системы, локальные или внешние адреса ядра, информация о паре сокетов и связанный адрес vnode
    NAME - имя локальной или удаленной точки монтирования файла NFS
    NAME - имя потока (STR)
    NAME - имя символьного устройства потока, имя потока, список имен потоковых модулей разделенных знаком -<

    #lsof без аргументов выдаст список всех открытых файлов #Найти программы, которые начинаются с символа с, например crond lsof -c c # просмотр всех соединений IPv4, открытых процессом с PID = 1234 lsof -i 4 -a -p 1234 #просмотр информации о процессе, который прослушивает 80 TCP порт sudo lsof -i tcp:80 #Список открытых файлов на устройстве /dev/hd4 или список процессов работающих с /dev/hd4 lsof /dev/hd4 #Список подключений по ssh lsof -c ssh #Список всех сетевых файлов, файлов, и принадлежащих процессов, владельцом которых является chich lsof -uchich #В качестве исключения можно использовать символ ^ (negated) sudo lsof -u ^chich

    Параметр -a объединяет все параметры с помощью логического И

    #список только файлов сокетов UNIX, которые принадлежат процессам пользователя chich lsof -a -U -u chich #Чтобы увидеть процессы которые используют файл: lsof /dev/sda # какие файлы открыты в указанном каталоге: lsof +D /var/log #Файлы, которые были открыты из каталога /home: sudo lsof +D /home
    Регулярные выражения

    Регулярные выражения в команде lsof используются для поиска файлов, открытых определёнными процессами
    Для этого применяется опция -c string, которая при использовании в виде /string/ трактуется как регулярное выражение
    Опция -с объединяет набор команд в одно целое
    Можно игнорировать вывод команды, указав отрицание "^"
    Метасимволы командной строки в регулярном выражении должны быть заключены в кавычки, чтобы предотвратить их интерпретацию командной строкой
    За закрывающей косой чертой могут следовать следующие модификаторы:
    b регулярное выражение является базовым
    i игнорировать регистр
    x расширенные регулярные выражения

    #Найти все файлы, имена которых начинается с "pipe" lsof -c /^pipe.*/i

    Параметр -b
    Параметр -A

    Полезные команды

    lsof - универсальный отладочный инструмент, который может заменить утилиты ps, netstat и др.

    #Установка в Linux Alpine apk add lsof #-u выводит список файлов, открытых конкретным пользователем lsof -u www-data #Файлы которые открыты всеми пользователями за исключением www-data lsof -u ^www-data #Открыть файлы, которые были открыты из директории home, но не от указанного пользователя: sudo lsof +D /home -u ^postgres -a #-U позволяет вывести все файлы сокетов домена Unix lsof -U | head -5 # -c выводит сведения о файлах, которые держат открытыми процессы, выполняющие команды, имена которых начинаются с заданных символов lsof -c sshd #Несколько команд sudo lsof -c ssh -c systemd # +d позволяет выяснить, какие папки и файлы открыты в некоей директории (но не в её поддиректориях) lsof +d /usr/bin # -p позволяет вывести все файлы, открытые указанным процессом lsof -p 14588 # -P подавляет, для сетевых файлов, преобразование номеров портов в имена портов # -n подавляет преобразование сетевых номеров в имена хостов для сетевых файлов lsof -P -c sshd # -i позволяет вывести сведения о файлах, интернет-адреса которых соответствуют заданному адресу # если по другому, данная опция выводит процессы, которые прослушивают определенные порты
    #Если при вызове команды не задавать адреса, эта опция позволяет вывести сведения обо всех интернет-сокетах и сетевых файлах #Если после неё не указано указание протокола, адреса или порта, то lsof выведет список всех сетевых файлов #lsof -i : #Показать сведения по ip-адресу ~# lsof -i @192.168.1.7 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 3702 root 4u IPv4 23881 0t0 TCP 192.168.1.8:ssh->192.168.1.7:42418 (ESTABLISHED) #Показать сведения по протоколу и номеру порта ~# lsof -i TCP:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 3272 root 3u IPv4 20916 0t0 TCP *:ssh (LISTEN) sshd 3272 root 4u IPv6 20918 0t0 TCP *:ssh (LISTEN) sshd 3702 root 4u IPv4 23881 0t0 TCP 192.168.1.8:ssh->192.168.1.7:42418 (ESTABLISHED) #Сведения об UDP соединениях ~# lsof -iUDP COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME memcached 2659 memcached 27u IPv4 919 0t0 UDP localhost:11211 memcached 2659 memcached 28u IPv4 919 0t0 UDP localhost:11211 memcached 2659 memcached 29u IPv4 919 0t0 UDP localhost:11211 memcached 2659 memcached 30u IPv4 919 0t0 UDP localhost:11211 #-i 6 можно вывести список открытых соединений IPv6 megaplan:~# lsof -i 6 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME telegram 2628 root 8u IPv6 18303 0t0 TCP *:8086 (LISTEN) redis-ser 2783 redis 7u IPv6 19319 0t0 TCP ::1:redis (LISTEN) epmd 3264 rabbitmq 4u IPv6 19746 0t0 TCP *:epmd (LISTEN) #Чтобы увидеть каким процессом был открыт файл: lsof - t /var/log/nginx/error.log # -t подавляет вывод всей информации за исключением ID процессов # данная опция может использовать для использования другими командами, например kill ~# lsof -t -i 6 2628 2783 3264 3272 4048 4363 4683 14601 #Процессы, которые используют сетевые соединения для конкретного пользователя lsof -i -u user #Можно исключить процессы определенного пользователя lsof -i -u ^root #список процессов, которые прослушивают сетевые порты из определенного диапазона lsof -i TCP:22-1024 lsof -t -c rabbit 16744 #Завершить все процессы rabbit kill $(lsof -t -c rabbit) #завершить все процессы пользователя kill -9 $(lsof -t -u user) #Прослушиваются sudo lsof -i -sTCP:LISTEN COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 36u IPv4 20635 0t0 TCP *:sunrpc (LISTEN) systemd 1 root 38u IPv6 20637 0t0 TCP *:sunrpc (LISTEN) #Установленные соединения sudo lsof -i -sTCP:ESTABLISHED NetworkMa 784 root 25u IPv4 927507 0t0 UDP X250:bootpc->_gateway:bootps redis-sen 962 redis 8u IPv4 30182 0t0 TCP localhost:42807->localhost:redis (ESTABLISHED) redis-sen 962 redis 9u IPv4 30183 0t0 TCP localhost:44027->localhost:redis (ESTABLISHED) #Показать файлы связанные с подключением к сети, указать процесс, программу, порт: lsof -i -p 1343 -c ssh :22 #Показать только указанный сокет: lsof -i UDP #Показать только указанный сокет и порт: lsof -i TCP:443 #Показать только указанный сокет и диапазон портов: lsof -i TCP:1-1000 #Сетевое соединение с указанным хостом и портом: lsof -i @192.168.1.1:22 #Размер открытых файлов и сортировка: lsof / -s | sort -rnk 7
    Просмотр в режиме реального времени
    lsof -s -c ssh +r2
    Примечания

    Обработка параметра +d не приводит к переходу по символическим ссылкам внутри указанного каталога, если не указан параметр -x или -xl. Также не выполняется поиск открытых файлов в точках монтирования файловой системы в подкаталогах указанного каталога, если не указан параметр -x или -xf


    Посмотреть файл дескриптор для данного процесса:
    $ ls -lah /proc/101744/fd/ итого 0 dr-x------ 2 t t 0 сен 11 11:59 . dr-xr-xr-x 9 t t 0 сен 11 11:59 .. lrwx------ 1 t t 64 сен 11 11:59 0 -> /dev/pts/1 lrwx------ 1 t t 64 сен 11 11:59 1 -> /dev/pts/1 lrwx------ 1 t t 64 сен 11 11:59 2 -> /dev/pts/1 lrwx------ 1 t t 64 сен 11 12:01 255 -> /dev/pts/1

    Отследить какие операции (системные вызовы) выполняет процесс в режиме реального времени:

    sudo strace -f -p 101744
    Источники
    Последнее изменение: 23.12.2024 04:02


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ