Lsof: когда все данные о файлах под рукой

main-photo

В отличие от других утилит, которые решают сразу множество задач, Lsof выполняет только одну, но делает это на высшем уровне – выводит информацию о файлах, которые используются теми или иными процессами.
Lsof имеет огромное количество функций. Мы рассмотрим основные.
Если запустить утилиту без ключа

# lsof

мы получим информацию о всех файлах, используемых процессами.
Чтобы посмотреть, кто использует файл, набираем команду

# lsof /path/to/file

Можно указать несколько файлов – тогда получим список всех процессов, которые используют данные файлы

# lsof /path/to/file1 /path/to/file2

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

# lsof +D /usr/lib

Получаем вывод

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 392 root mem REG 8,1 48088 9566 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1
rpcbind 392 root mem REG 8,1 195400 9572 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
rpcbind 392 root mem REG 8,1 867776 9581 /usr/lib/x86_64-linux-gnu/libkrb5.so.3.3
rpcbind 392 root mem REG 8,1 306072 9590 /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2.2
rpc.statd 401 statd mem REG 8,1 48088 9566 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1
rpc.statd 401 statd mem REG 8,1 195400 9572 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
rpc.statd 401 statd mem REG 8,1 867776 9581 /usr/lib/x86_64-linux-gnu/libkrb5.so.3.3
rpc.statd 401 statd mem REG 8,1 306072 9590 /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2.2
rpc.idmap 415 root mem REG 8,1 293264 9541 /usr/lib/x86_64-linux-gnu/libevent-2.0.so.5.1.9
cron 417 root mem REG 8,1 26258 6179 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache

Смотрим файлы, открытые пользователем. В нашем случае это root.

# lsof –root

Чтобы посмотреть файлы, открытые несколькими пользователями

# lsof –u user1 –u root

Или

# lsof –u user1, root

В моем случае команда будет выглядеть вот так

~# lsof -u victoria,root

В качестве вывода получаем список файлов, открытых этими пользователями.
Утилита lsof позволяет искать файлы по имени процесса. Вводим

#lsof –c cron

Получаем список файлов, принадлежащих процессу, чье имя начинается с cron

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cron 417 root cwd DIR 8,2 4096 687 /var/spool/cron
cron 417 root rtd DIR 8,1 4096 2 /
cron 417 root txt REG 8,1 44400 4701 /usr/sbin/cron
cron 417 root mem REG 8,1 47712 135318 /lib/x86_64-linux-gnu/libnss_files-2.19.so
cron 417 root mem REG 8,1 43592 135320 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
cron 417 root mem REG 8,1 89104 135315 /lib/x86_64-linux-gnu/libnsl-2.19.so
cron 417 root mem REG 8,1 31632 135316 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
cron 417 root mem REG 8,1 137384 128798 /lib/x86_64-linux-gnu/libpthread-2.19.so
cron 417 root mem REG 8,1 448440 128572 /lib/x86_64-linux-gnu/libpcre.so.3.13.1

Эта команда выводит перечень всех процессов с PID.

# lsof –p 1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,1 4096 2 /
systemd 1 root rtd DIR 8,1 4096 2 /
systemd 1 root txt REG 8,1 1313160 128998 /lib/systemd/systemd
systemd 1 root mem REG 8,1 18640 128556 /lib/x86_64-linux-gnu/libattr.so.1.1.0
systemd 1 root mem REG 8,1 14664 135312 /lib/x86_64-linux-gnu/libdl-2.19.so
systemd 1 root mem REG 8,1 448440 128572 /lib/x86_64-linux-gnu/libpcre.so.3.13.1
systemd 1 root mem REG 8,1 31784 135324 /lib/x86_64-linux-gnu/librt-2.19.so
systemd 1 root mem REG 8,1 92888 128836 /lib/x86_64-linux-gnu/libkmod.so.2.2.8

Ключ –p показывает список файлов с id.
Чтобы искать файлы по заданному id, прописываем его в командной строке

# lsof -p 67, 68
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
khubd 67 root cwd DIR 8,1 4096 2 /
khubd 67 root rtd DIR 8,1 4096 2 /
khubd 67 root txt unknown /proc/67/exe
ata_sff 68 root cwd DIR 8,1 4096 2 /
ata_sff 68 root rtd DIR 8,1 4096 2 /
ata_sff 68 root txt unknown /proc/68/exe

Чтобы найти все процессы, кроме процесса с заданным id, пишем

# lsof –p^1

Команда, приведенная ниже в примере, показывает полный список сетевых соединений

# lsof-i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dhclient 371 root 6u IPv4 9924 0t0 UDP *:bootpc
dhclient 371 root 20u IPv4 9895 0t0 UDP *:26775
dhclient 371 root 21u IPv6 9896 0t0 UDP *:51883
rpcbind 392 root 6u IPv4 10063 0t0 UDP *:sunrpc
rpcbind 392 root 7u IPv4 10066 0t0 UDP *:991
rpcbind 392 root 8u IPv4 10067 0t0 TCP *:sunrpc (LISTEN)
rpcbind 392 root 9u IPv6 10068 0t0 UDP *:sunrpc
rpcbind 392 root 10u IPv6 10069 0t0 UDP *:991
rpcbind 392 root 11u IPv6 10070 0t0 TCP *:sunrpc (LISTEN)

Cмотрим список всех TCP соединений командой

# lsof –I tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 392 root 8u IPv4 10067 0t0 TCP *:sunrpc (LISTEN)
rpcbind 392 root 11u IPv6 10070 0t0 TCP *:sunrpc (LISTEN)
rpc.statd 401 statd 9u IPv4 10178 0t0 TCP *:35258 (LISTEN)
rpc.statd 401 statd 11u IPv6 10184 0t0 TCP *:37086 (LISTEN)
sshd 418 root 3u IPv4 11339 0t0 TCP *:ssh (LISTEN)
sshd 418 root 4u IPv6 11346 0t0 TCP *:ssh (LISTEN)
exim4 692 Debian-exim 4u IPv4 11551 0t0 TCP localhost:smtp (LISTEN)
exim4 692 Debian-exim 5u IPv6 11552 0t0 TCP localhost:smtp (LISTEN)
sshd 708 root 3u IPv4 11682 0t0 TCP 10.0.2.15:ssh->10.0.2.2:51587 (ESTABLISHED)
sshd 710 victoria 3u IPv4 11682 0t0 TCP 10.0.2.15:ssh->10.0.2.2:51587 (ESTABLISHED)

Вывод перечня UDP соединений

# lsof –i udp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dhclient 371 root 6u IPv4 9924 0t0 UDP *:bootpc
dhclient 371 root 20u IPv4 9895 0t0 UDP *:26775
dhclient 371 root 21u IPv6 9896 0t0 UDP *:51883
rpcbind 392 root 6u IPv4 10063 0t0 UDP *:sunrpc
rpcbind 392 root 7u IPv4 10066 0t0 UDP *:991
rpcbind 392 root 9u IPv6 10068 0t0 UDP *:sunrpc
rpcbind 392 root 10u IPv6 10069 0t0 UDP *:991
rpc.statd 401 statd 7u IPv4 10172 0t0 UDP localhost:1002
rpc.statd 401 statd 8u IPv4 10175 0t0 UDP *:56799

Чтобы узнать, кто использует сейчас наш порт, прописываем команду (мы подключились к 22-му порту)

# lsof –I :22

Видим список всех, кто использует эти порты. В моем случае это root и пользователь victoria.

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 420 root 3u IPv4 11347 0t0 TCP *:ssh (LISTEN)
sshd 420 root 4u IPv6 11354 0t0 TCP *:ssh (LISTEN)
sshd 706 root 3u IPv4 11693 0t0 TCP 10.0.2.15:ssh->10.0.2.2:50329 (ESTABLISHED)
sshd 708 victoria 3u IPv4 11693 0t0 TCP 10.0.2.15:ssh->10.0.2.2:50329 (ESTABLISHED)

Следующая команда позволяет показать, какие файлы использовал конкретный юзер. Например, я хочу посмотреть информацию о файлах пользователя под именем victoria. Для этого я пишу команду

# lsof -a -u victoria –i

Получаем вывод

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 708 victoria 3u IPv4 11693 0t0 TCP 10.0.2.15:ssh->10.0.2.2:50 329 (ESTABLISHED)

Список всех файлов NFS (Network File System) смотрим командой

# lsof –N

Чтобы посмотреть вывод всех файловых сокетов домена Unix, вводим команду

# lsof –U

Вот часть вывода

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 11u unix 0xffff88003ab5b040 0t0 7811 /run/systemd/notify
systemd 1 root 12u unix 0xffff880037219bc0 0t0 7813 /run/systemd/private
systemd 1 root 24u unix 0xffff88003ab5bb80 0t0 7829 /run/systemd/shutdownd
systemd 1 root 25u unix 0xffff88003ab5b400 0t0 7831 /run/systemd/journal/dev-log
systemd 1 root 26u unix 0xffff88003ab5b7c0 0t0 7835 /run/udev/control

Далее смотрим список всех файлов с файловым дескриптором № 2.

# lsof –d 0-2
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 2u CHR 1,3 0t0 5580 /dev/null
systemd-j 140 root 2w CHR 1,3 0t0 5580 /dev/null
systemd-u 147 root 2u CHR 1,3 0t0 5580 /dev/null
dhclient 373 root 2u CHR 1,3 0t0 5580 /dev/null
rpcbind 394 root 2u CHR 1,3 0t0 5580 /dev/null
rpc.statd 403 statd 2u CHR 1,3 0t0 5580 /dev/null
rpc.idmap 417 root 2u CHR 1,3 0t0 5580 /dev/null
atd 418 daemon 2u CHR 1,3 0t0 5580 /dev/null
cron 419 root 2u unix 0xffff8800373df0c0 0t0 10687 socket
sshd 420 root 2u unix 0xffff8800373d70c0 0t0 10939 socket

Задаем специальное значение mem, чтобы посмотреть список файлов, отображаемых память

# lsof -d mem
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root mem REG 8,1 18640 128556 /lib/x86_64-linux-gnu/libattr.so.1.1.0
systemd 1 root mem REG 8,1 14664 135312 /lib/x86_64-linux-gnu/libdl-2.19.so
systemd 1 root mem REG 8,1 448440 128572 /lib/x86_64-linux-gnu/libpcre.so.3.13.1
systemd 1 root mem REG 8,1 31784 135324 /lib/x86_64-linux-gnu/librt-2.19.so
systemd 1 root mem REG 8,1 92888 128836 /lib/x86_64-linux-gnu/libkmod.so.2.2.8

Список txt файлов смотрим при помощи команды

# lsof -d txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root txt REG 8,1 1313160 128998 /lib/systemd/systemd
kthreadd 2 root txt unknown /proc/2/exe
ksoftirqd 3 root txt unknown /proc/3/exe
kworker/0 5 root txt unknown /proc/5/exe
kworker/u 6 root txt unknown /proc/6/exe
rcu_sched 7 root txt unknown /proc/7/exe
rcu_bh 8 root txt unknown /proc/8/exe
migration 9 root txt unknown /proc/9/exe
watchdog/ 10 root txt unknown /proc/10/exe

Чтобы выводить список файлов через определённое время прописываем ключ –r.
Например, если нужно повторять листинг файлов через каждую минуту, вводим команду

# lsof –r 1

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

# lsof –h

Основные команды для работы с Linux-системами мы изучаем на нашем авторском курсе «Администрирование Linux. Базовый уровень»!

Залишити відповідь

Дякуємо, що поділились