Linux.Команда lsof

08.10.2023

Теги: CLILinuxКомандаФайл

Команда lsof показывает информацию, какие файлы были открыты тем или иным процессом. И наоборот — показывает информацию, какие процессы открыли тот или иной файл. При использовании команды без опций и указания файла — в терминал выводятся все файлы, которые открыты (используются) в системе.

$ lsof [опции] [файл]

Давайте создадим директорию /home/evgeniy/demo-lsof, внутри нее — файл edit-by-nano.txt и откроем этот файл на редактирование в помощью редактора nano.

$ mkdir /home/evgeniy/demo-lsof
$ cd /home/evgeniy/demo-lsof
$ touch edit-by-nano.txt
$ nano edit-by-nano.txt

В другом терминале запустим команду lsof

$ lsof /usr/bin/bash
COMMAND  PID    USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    1485 evgeniy txt    REG    8,5  1396520 3933439 /usr/bin/bash
bash    1550 evgeniy txt    REG    8,5  1396520 3933439 /usr/bin/bash
$ lsof /usr/bin/nano
COMMAND  PID    USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
nano    1721 evgeniy txt    REG    8,5   283144 3932952 /usr/bin/nano

При таком использовании команда показывает процесс, который открыл указанный файл. У нас открыто два терминала — соответственно, запущено два процесса bash. Мы редактируем файл с помощью nano — запущен процесс редактора.

Опция -c string

Список файлов, которые были открыты командой, которая начинается на string. При использовании в виде /string/ — трактуется как регулярное выражение. После второго слэша можно добавить b,x,i — базовые regexp, расширенные regexp, игнорировать регистр.

$ lsof -c nano
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
nano    1721 evgeniy  cwd    DIR    8,5     4096 6032576 /home/evgeniy/demo-lsof
nano    1721 evgeniy  rtd    DIR    8,5     4096       2 /
nano    1721 evgeniy  txt    REG    8,5   283144 3932952 /usr/bin/nano
nano    1721 evgeniy  mem    REG    8,5  5721376 3932765 /usr/lib/locale/locale-archive
nano    1721 evgeniy  mem    REG    8,5  2216304 3933583 /usr/lib/x86_64-linux-gnu/libc.so.6
nano    1721 evgeniy  mem    REG    8,5    74257 6030694 /usr/share/locale-langpack/ru/LC_MESSAGES/nano.mo
nano    1721 evgeniy  mem    REG    8,5   200136 3932822 /usr/lib/x86_64-linux-gnu/libtinfo.so.6.3
nano    1721 evgeniy  mem    REG    8,5   239696 3932557 /usr/lib/x86_64-linux-gnu/libncursesw.so.6.3
nano    1721 evgeniy  mem    REG    8,5    27002 4593543 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
nano    1721 evgeniy  mem    REG    8,5   240936 3932613 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
nano    1721 evgeniy    0u   CHR  136,1      0t0       4 /dev/pts/1
nano    1721 evgeniy    1u   CHR  136,1      0t0       4 /dev/pts/1
nano    1721 evgeniy    2u   CHR  136,1      0t0       4 /dev/pts/1

Видим, что команда nano открыла директорию /home/evgeniy/demo-lsof, бинарный файл редактора /usr/bin/nano и терминал /dev/pts/1. Кроме того, были открыты файлы библиотек в директории /usr/lib/x86_64-linux-gnu.

Опция -p number

Список файлов, открытых процессом с идентификатором PID, равным number.

Давайте найдем идентифкатор процесса запущенного редактора nano

$ pgrep nano
1721

Выполним команду lsof с указанием PID

$ lsof -p 1721
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
nano    1721 evgeniy  cwd    DIR    8,5     4096 6032576 /home/evgeniy/demo-lsof
nano    1721 evgeniy  rtd    DIR    8,5     4096       2 /
nano    1721 evgeniy  txt    REG    8,5   283144 3932952 /usr/bin/nano
nano    1721 evgeniy  mem    REG    8,5  5721376 3932765 /usr/lib/locale/locale-archive
nano    1721 evgeniy  mem    REG    8,5  2216304 3933583 /usr/lib/x86_64-linux-gnu/libc.so.6
nano    1721 evgeniy  mem    REG    8,5    74257 6030694 /usr/share/locale-langpack/ru/LC_MESSAGES/nano.mo
nano    1721 evgeniy  mem    REG    8,5   200136 3932822 /usr/lib/x86_64-linux-gnu/libtinfo.so.6.3
nano    1721 evgeniy  mem    REG    8,5   239696 3932557 /usr/lib/x86_64-linux-gnu/libncursesw.so.6.3
nano    1721 evgeniy  mem    REG    8,5    27002 4593543 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
nano    1721 evgeniy  mem    REG    8,5   240936 3932613 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
nano    1721 evgeniy    0u   CHR  136,1      0t0       4 /dev/pts/1
nano    1721 evgeniy    1u   CHR  136,1      0t0       4 /dev/pts/1
nano    1721 evgeniy    2u   CHR  136,1      0t0       4 /dev/pts/1

Опция +D /some/path

Список процессов, которые работают с файлами в директории /some/path.

Напомню — в другом терминале мы перешли в директорию /home/evgeniy/demo-lsof и запустили редактор nano. Посмотрим, какие процессы используют эту директорию.

$ lsof +D /home/evgeniy/demo-lsof
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    1550 evgeniy  cwd    DIR    8,5     4096 6032576 /home/evgeniy/demo-lsof
nano    1721 evgeniy  cwd    DIR    8,5     4096 6032576 /home/evgeniy/demo-lsof
$ lsof +D /home/evgeniy | grep demo-lsof
bash      1550 evgeniy  cwd    DIR    8,5     4096 6032576 /home/evgeniy/demo-lsof
nano      1721 evgeniy  cwd    DIR    8,5     4096 6032576 /home/evgeniy/demo-lsof

Еще один пример — какие процессы держат открытыми файлы в директории /var/log/journal.

$ sudo lsof +D /var/log/journal
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF    NODE NAME
systemd-j 190 root  mem    REG    8,5   8388608 1180069 /var/log/journal/6459f5cf3b8345179ca74d6c586e5839/user-1000.journal
systemd-j 190 root  mem    REG    8,5   8388608 1179966 /var/log/journal/6459f5cf3b8345179ca74d6c586e5839/system.journal
systemd-j 190 root   22u   REG    8,5   8388608 1179966 /var/log/journal/6459f5cf3b8345179ca74d6c586e5839/system.journal
systemd-j 190 root   43u   REG    8,5   8388608 1180069 /var/log/journal/6459f5cf3b8345179ca74d6c586e5839/user-1000.journal

Опции -o (OR) и -a (AND)

Команда lsof допускает использование нескольких опций — по умолчанию они объединяются с использованием логики ИЛИ (OR).

Опция -u username

Список файлов, открытых процессами, запущенными пользователем username.

Если просто использовать опцию -u — список будет очень большим. Поэтому используем две опции — отберем файлы, открытые процессами пользователя evgeniy, но только те файлы, которые были открыты в домашней директории пользователя.

$ lsof -a -u evgeniy +D /home/evgeniy
COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash      1485 evgeniy  cwd    DIR    8,5     4096 6046678 /home/evgeniy
bash      1550 evgeniy  cwd    DIR    8,5     4096 6032576 /home/evgeniy/demo-lsof
nano      1721 evgeniy  cwd    DIR    8,5     4096 6032576 /home/evgeniy/demo-lsof
dbus-daem 2024 evgeniy  cwd    DIR    8,5     4096 6046678 /home/evgeniy
lsof      2072 evgeniy  cwd    DIR    8,5     4096 6046678 /home/evgeniy
lsof      2073 evgeniy  cwd    DIR    8,5     4096 6046678 /home/evgeniy

Опция -i address

Список процессов, которые используют сетевые интерфейсы для соединения с указанным address.

$ sudo lsof -i [46][TCP|UDP][@hostname|hostaddr][:service|port]

Процессы, которые используют сетевой интерфейс для соединения по протоколу https

$ sudo lsof -i4 :https
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
firefox 40621 evgeniy   54u  IPv4  83336      0t0  TCP ubuntu-server:41866->172.64.41.4:https (ESTABLISHED)
firefox 40621 evgeniy   55u  IPv4  83340      0t0  TCP ubuntu-server:49930->55.65.117.34.bc.google.com:https (ESTABLISHED)

Процессы, которые используют сетевой интерфейс для соединения, используя порт 22

$ sudo lsof -i :22
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    18266    root    3u  IPv4  46766      0t0  TCP *:ssh (LISTEN)
sshd    18266    root    4u  IPv6  46777      0t0  TCP *:ssh (LISTEN)
sshd    41068    root    4u  IPv4  66333      0t0  TCP ubuntu-server:ssh->192.168.110.14:57502 (ESTABLISHED)
sshd    41105 evgeniy    4u  IPv4  66333      0t0  TCP ubuntu-server:ssh->192.168.110.14:57502 (ESTABLISHED)

Процессы, которые используют сетевой интерфейс для соединения с хостом 192.168.110.14

$ sudo lsof -i @192.168.110.14
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    41610    root    4u  IPv4  91369      0t0  TCP ubuntu-server:ssh->192.168.110.14:36748 (ESTABLISHED)
sshd    41669 evgeniy    4u  IPv4  91369      0t0  TCP ubuntu-server:ssh->192.168.110.14:36748 (ESTABLISHED)

Поиск: CLI • Linux • Команда • Файл

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.