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

В отличие от других утилит, которые решают сразу множество задач, 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. Базовый уровень»!