Использование 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
Источники
Связанные темы
Использование модуля pg_stat_statements в postgresql
Поиск уязвимостей и следов взлома в Linux
Управление планировщиком в Postgresql
Системные каталоги в Postgresql