Команда lsof

Опубликовано admin - пн, 04/10/2023 - 14:48

В Linux команда lsof (LiSt Open Files) позволяет выводить список всех открытых файлов, а в Linux файлами является всё.

Примеры использования команды lsof в Linux

Применение этой утилиты крайне полезно при необходимости размонтирования диска, на котором ряд файлов ещё используется.

Содержание

Синтаксис

lsof [опция][имя_пользователя]

Использование команды lsof в Linux

Список всех открытых файлов

В данном случае команда запускается без опций:

oleg@mobile:~:$ sudo lsof
COMMAND    PID      USER   FD      TYPE     DEVICE  SIZE/OFF       NODE NAME
...
lsof      50808                             root  cwd       DIR                8,8       20480   18874369 /home/oleg
lsof      50808                             root  rtd       DIR                8,6        4096          2 /
lsof      50808                             root  txt       REG                8,6      175648    1458779 /usr/bin/lsof
lsof      50808                             root  mem       REG                8,6     3387904    1471186 /usr/lib/locale/locale-archive
lsof      50808                             root  mem       REG                8,6       59704    1445231 /usr/lib/libresolv.so.2
lsof      50808                             root  mem       REG                8,6       22200    1453661 /usr/lib/libkeyutils.so.1.10
lsof      50808                             root  mem       REG                8,6       55352    1453870 /usr/lib/libkrb5support.so.0.1
lsof      50808                             root  mem       REG                8,6       18304    1449241 /usr/lib/libcom_err.so.2.1
lsof      50808                             root  mem       REG                8,6      182128    1453826 /usr/lib/libk5crypto.so.3.1
lsof      50808                             root  mem       REG                8,6      882552    1453867 /usr/lib/libkrb5.so.3.3
lsof      50808                             root  mem       REG                8,6      344160    1453815 /usr/lib/libgssapi_krb5.so.2.2
lsof      50808                             root  mem       REG                8,6     1953112    1445176 /usr/lib/libc.so.6
lsof      50808                             root  mem       REG                8,6      182696    1453938 /usr/lib/libtirpc.so.3.0.0
lsof      50808                             root  mem       REG                8,6      216192    1445160 /usr/lib/ld-linux-x86-64.so.2
lsof      50808                             root    4r     FIFO               0,13         0t0     185603 pipe
lsof      50808                             root    7w     FIFO               0,13         0t0     185604 pipe
oleg@mobile:~:$

Здесь выведена лишь незначительная часть списка, так как он весьма велик.

Рассмотрим подробнее два столбца FD и TYPE.

FD (дескриптор файла) может иметь следующие значения:

cwd
Текущий рабочий каталог
rtd
Корневой каталог
txt
Текст программы (код и данные)
mem
Файл памяти
r
Режим доступа для чтения
w
Режим доступа для записи
u
Режим чтения и записи

TYPE — тип файлов и их идентификация:

DIR
Каталог
REG
Обычный файл
CHR
Специальный символьный файл.
FIFO
First In First Out

Список открытых файлов конкретного пользователя

В данном случае утилита используется с опцией -u:

oleg@mobile:~:$ lsof -u oleg
COMMAND    PID      USER   FD      TYPE     DEVICE  SIZE/OFF       NODE NAME
...
lsof      53390 oleg    6r     FIFO               0,13       0t0     192702 pipe
lsof      53391 oleg  cwd       DIR                8,8     20480   18874369 /home/oleg
lsof      53391 oleg  rtd       DIR                8,6      4096          2 /
lsof      53391 oleg  txt       REG                8,6    175648    1458779 /usr/bin/lsof
lsof      53391 oleg  mem       REG                8,6   3387904    1471186 /usr/lib/locale/locale-archive
lsof      53391 oleg  mem       REG                8,6     59704    1445231 /usr/lib/libresolv.so.2
lsof      53391 oleg  mem       REG                8,6     22200    1453661 /usr/lib/libkeyutils.so.1.10
lsof      53391 oleg  mem       REG                8,6     55352    1453870 /usr/lib/libkrb5support.so.0.1
lsof      53391 oleg  mem       REG                8,6     18304    1449241 /usr/lib/libcom_err.so.2.1
lsof      53391 oleg  mem       REG                8,6    182128    1453826 /usr/lib/libk5crypto.so.3.1
lsof      53391 oleg  mem       REG                8,6    882552    1453867 /usr/lib/libkrb5.so.3.3
lsof      53391 oleg  mem       REG                8,6    344160    1453815 /usr/lib/libgssapi_krb5.so.2.2
lsof      53391 oleg  mem       REG                8,6   1953112    1445176 /usr/lib/libc.so.6
lsof      53391 oleg  mem       REG                8,6    182696    1453938 /usr/lib/libtirpc.so.3.0.0
lsof      53391 oleg  mem       REG                8,6    216192    1445160 /usr/lib/ld-linux-x86-64.so.2
lsof      53391 oleg    4r     FIFO               0,13       0t0     192701 pipe
lsof      53391 oleg    7w     FIFO               0,13       0t0     192702 pipe
oleg@mobile:~:$ 

Процессы, запущенные на определённом порту

Для вывода процессов, запущенных на определённом порту, утилита запускается с опцией -i. Выводим процессы, запущенные на порту 22:

oleg@mobile:~:$ sudo lsof -i TCP:22
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    355 root    3u  IPv4  17746      0t0  TCP *:ssh (LISTEN)
sshd    355 root    4u  IPv6  17748      0t0  TCP *:ssh (LISTEN)
oleg@mobile:~:$ 

Список IPv4 и IPv6 открытых файлов

В этом случае указываются порты 4 (IPv4) и 6 (IPv6):

oleg@mobile:~:$ sudo lsof -i 4
COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
NetworkMa   347  root   24u  IPv4  17923      0t0  UDP mobile:bootpc->_gateway:bootps 
sshd        355  root    3u  IPv4  17746      0t0  TCP *:ssh (LISTEN)
nginx       367  root   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
nginx       368  http   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
nginx       369  http   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
mariadbd    391 mysql   22u  IPv4  17922      0t0  TCP *:mysql (LISTEN)
chromium  13650  oleg  177u  IPv4  58330      0t0  UDP 224.0.0.251:mdns 
chromium  13700  oleg   22u  IPv4 204153      0t0  UDP mobile:45726->sof02s31-in-f2.1e100.net:https 
chromium  13700  oleg   26u  IPv4 194785      0t0  TCP mobile:38656->mc.yandex.ru:https (ESTABLISHED)
chromium  13700  oleg   27u  IPv4 203752      0t0  UDP mobile:36409->sof04s07-in-f10.1e100.net:https 
chromium  13700  oleg   44u  IPv4  84307      0t0  TCP mobile:43248->yandex.ru:https (ESTABLISHED)
chromium  13700  oleg   47u  IPv4 148309      0t0  TCP mobile:53348->yandex.ru:https (ESTABLISHED)
chromium  13700  oleg   55u  IPv4 149507      0t0  TCP mobile:59400->bs.yandex.ru:https (ESTABLISHED)
chromium  13700  oleg   64u  IPv4 148315      0t0  TCP mobile:59386->bs.yandex.ru:https (ESTABLISHED)
oleg@mobile:~:$
oleg@mobile:~:$ sudo lsof -i 6
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     355  root    4u  IPv6  17748      0t0  TCP *:ssh (LISTEN)
mariadbd 391 mysql   26u  IPv6  17924      0t0  TCP *:mysql (LISTEN)
oleg@mobile:~:$

 Список открытых файлов TCP-портов 1-1024

Вывод списка открытых портов в диапазоне 1-1024 осуществляется так:

oleg@mobile:~:$ sudo lsof -i TCP:1-1024
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd       355 root    3u  IPv4  17746      0t0  TCP *:ssh (LISTEN)
sshd       355 root    4u  IPv6  17748      0t0  TCP *:ssh (LISTEN)
nginx      367 root   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
nginx      368 http   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
nginx      369 http   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
chromium 13700 oleg   26u  IPv4 194785      0t0  TCP mobile:38656->mc.yandex.ru:https (ESTABLISHED)
chromium 13700 oleg   44u  IPv4  84307      0t0  TCP mobile:43248->yandex.ru:https (ESTABLISHED)
chromium 13700 oleg   47u  IPv4 148309      0t0  TCP mobile:53348->yandex.ru:https (ESTABLISHED)
chromium 13700 oleg   55u  IPv4 149507      0t0  TCP mobile:59400->bs.yandex.ru:https (ESTABLISHED)
chromium 13700 oleg   64u  IPv4 148315      0t0  TCP mobile:59386->bs.yandex.ru:https (ESTABLISHED)
oleg@mobile:~:$ 

Исключение пользователя

Для исключения пользователя в запускаемой команде используется символ ^. Исключаем пользователя root:

oleg@mobile:~:$ sudo lsof -i -u^root
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx      368  http   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
nginx      369  http   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
mariadbd   391 mysql   22u  IPv4  17922      0t0  TCP *:mysql (LISTEN)
mariadbd   391 mysql   26u  IPv6  17924      0t0  TCP *:mysql (LISTEN)
chromium 13650  oleg  177u  IPv4  58330      0t0  UDP 224.0.0.251:mdns 
chromium 13700  oleg   22u  IPv4 209135      0t0  TCP mobile:53766->sof02s18-in-f14.1e100.net:https (ESTABLISHED)
chromium 13700  oleg   26u  IPv4 194785      0t0  TCP mobile:38656->mc.yandex.ru:https (ESTABLISHED)
chromium 13700  oleg   27u  IPv4 208940      0t0  TCP mobile:55728->185.65.148.89:https (ESTABLISHED)
chromium 13700  oleg   33u  IPv4 209885      0t0  UDP mobile:36603->sof04s02-in-f10.1e100.net:https 
chromium 13700  oleg   41u  IPv4 209141      0t0  TCP mobile:60226->104.16.89.20:https (ESTABLISHED)
chromium 13700  oleg   44u  IPv4  84307      0t0  TCP mobile:43248->yandex.ru:https (ESTABLISHED)
chromium 13700  oleg   47u  IPv4 148309      0t0  TCP mobile:53348->yandex.ru:https (ESTABLISHED)
chromium 13700  oleg   50u  IPv4 209062      0t0  TCP mobile:34824->93.186.225.194:https (ESTABLISHED)
chromium 13700  oleg   55u  IPv4 149507      0t0  TCP mobile:59400->bs.yandex.ru:https (ESTABLISHED)
chromium 13700  oleg   64u  IPv4 148315      0t0  TCP mobile:59386->bs.yandex.ru:https (ESTABLISHED)
oleg@mobile:~:$ 

Наблюдение за работой конкретного пользователя

Наблюдаем за просмотром файлов и использованием команд пользователем oleg:

oleg@mobile:~:$ sudo lsof -i -u^root
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
...
chromium  59280  oleg   34r      REG               0,18         0     209042 /proc/59280/statm
chromium  59280  oleg   35r      REG               0,18         0     209041 /proc/59280/status
sleep     61320  oleg  cwd       DIR                8,8     20480   18874369 /home/oleg
sleep     61320  oleg  rtd       DIR                8,6      4096          2 /
sleep     61320  oleg  txt       REG                8,6     30872    1454803 /usr/bin/sleep
sleep     61320  oleg  mem       REG                8,6   3387904    1471186 /usr/lib/locale/locale-archive
sleep     61320  oleg  mem       REG                8,6   1953112    1445176 /usr/lib/libc.so.6
sleep     61320  oleg  mem       REG                8,6    216192    1445160 /usr/lib/ld-linux-x86-64.so.2
sleep     61320  oleg    0r      CHR                1,3       0t0          4 /dev/null
sleep     61320  oleg    1u     unix 0x0000000023ce2b14       0t0      17706 type=STREAM (CONNECTED)
sleep     61320  oleg    2u     unix 0x0000000023ce2b14       0t0      17706 type=STREAM (CONNECTED)
sleep     61320  oleg    3w      REG                8,6     82983     531092 /var/log/slim.log
oleg@mobile:~:$ 

Список всех сетевых подключений

В данном случае утилита просто запускается с опцией -i:

oleg@mobile:~:$ sudo lsof -i
COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
NetworkMa   347  root   24u  IPv4  17923      0t0  UDP mobile:bootpc->_gateway:bootps 
sshd        355  root    3u  IPv4  17746      0t0  TCP *:ssh (LISTEN)
sshd        355  root    4u  IPv6  17748      0t0  TCP *:ssh (LISTEN)
nginx       367  root   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
nginx       368  http   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
nginx       369  http   16u  IPv4  18689      0t0  TCP *:http (LISTEN)
mariadbd    391 mysql   22u  IPv4  17922      0t0  TCP *:mysql (LISTEN)
mariadbd    391 mysql   26u  IPv6  17924      0t0  TCP *:mysql (LISTEN)
chromium  13650  oleg  177u  IPv4  58330      0t0  UDP 224.0.0.251:mdns 
chromium  13700  oleg   26u  IPv4 194785      0t0  TCP mobile:38656->mc.yandex.ru:https (ESTABLISHED)
chromium  13700  oleg   44u  IPv4  84307      0t0  TCP mobile:43248->yandex.ru:https (ESTABLISHED)
chromium  13700  oleg   47u  IPv4 148309      0t0  TCP mobile:53348->yandex.ru:https (ESTABLISHED)
chromium  13700  oleg   55u  IPv4 149507      0t0  TCP mobile:59400->bs.yandex.ru:https (ESTABLISHED)
chromium  13700  oleg   64u  IPv4 148315      0t0  TCP mobile:59386->bs.yandex.ru:https (ESTABLISHED)
oleg@mobile:~:$ 

Поиск по PID

Ищем по PID 391:

oleg@mobile:~:$ sudo lsof -p 391
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND  PID  USER   FD      TYPE             DEVICE  SIZE/OFF    NODE NAME
mariadbd 391 mysql  cwd       DIR                8,6      4096  526449 /var/lib/mysql
mariadbd 391 mysql  rtd       DIR                8,6      4096       2 /
mariadbd 391 mysql  txt       REG                8,6  25373560 1476291 /usr/bin/mariadbd
...
mariadbd 391 mysql  104u      REG                8,6    114688  531971 /var/lib/mysql/svastiru/users.ibd
mariadbd 391 mysql  105u      REG                8,6     98304  531973 /var/lib/mysql/svastiru/users_data.ibd
mariadbd 391 mysql  106u      REG                8,6    180224  531975 /var/lib/mysql/svastiru/users_field_data.ibd
mariadbd 391 mysql  107u      REG                8,6    327680  531977 /var/lib/mysql/svastiru/watchdog.ibd
mariadbd 391 mysql  108u      REG                8,6    638976  531979 /var/lib/mysql/svastiru/xmlsitemap.ibd
oleg@mobile:~:$ 

Убиваем активности конкретного пользователя

Приводимая команда убьёт все процессы пользователя oleg:

oleg@mobile:~:$ sudo kill -9 `lsof -t -u oleg`

Заключение

В данной статье была приведена незначительная часть возможностей команды lsof в Linux. Эта утилита, выводящая список открытых файлов, очень полезна. Для ознакомления с полным списком её опций достаточно набрать lsof --help.

Поделиться с друзьями