Linux.Команда lsof
Команда 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)