lsof — это мощный инструмент, доступный для систем Linux и Unix, который буквально означает «список (из) открытых файлов».
Его основная функция — получить подробную информацию о различных типах файлов, открытых разными запущенными процессами. Эти файлы могут быть обычными файлами, каталогами, файлами блоков, сетевыми сокетами, именованными каналами и т. д.
Установка lsof
sof
не доступен по умолчанию в большинстве дистрибутивов Linux, но может быть легко установлен. Используйте следующую команду для установки lsof:
CentOS / RHEL / Fedora:
$ sudo yum install lsof
для CentOS / RHEL 8, вы можете использовать DNF команду
$ sudo dnf install lsof
Ubuntu / Debian:
$ sudo apt install lsof
Получение помощи
Вы можете получить сводный список поддерживаемых lsof опций, используя -?
или -h
.
$ lsof -?
lsof 4.87
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
usage: [-?abhKlnNoOPRtUvVX] [ |-c c] [ |-d s] [ D D] [ |-f[gG]] [ |-e s]
[-F [f]] [-g [s]] [-i [i]] [ |-L [l]] [ m [m]] [ |-M] [-o [o]] [-p s]
[ |-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [ |-w] [-x [fl]] [-Z [Z]] [--] [names]
Defaults in parentheses; comma-separated set (s) items; dash-separated ranges.
-?|-h list help -a AND selections (OR) -b avoid kernel blocks
-c c cmd c ^c /c/[bix] c w COMMAND width (9) d s dir s files
-d s select by FD set D D dir D tree *SLOW?* |-e s exempt s *RISKY*
-i select IPv[46] files -K list tasKs (threads) -l list UID numbers
-n no host names -N select NFS files -o list file offset
-O no overhead *RISKY* -P no port names -R list paRent PID
-s list file size -t terse listing -T disable TCP/TPI info
-U select Unix socket -v list version info -V verbose search
|-w Warnings ( ) -X skip TCP&UDP* files -Z Z context [Z]
-- end option scan
f|-f filesystem or -file names |-f[gG] flaGs
-F [f] select fields; -F? for help
|-L [l] list ( ) suppress (-) link counts < l (0 = all; default = 0)
m [m] use|create mount supplement
|-M portMap registration (-) -o o o 0t offset digits (8)
-p s exclude(^)|select PIDs -S [t] t second stat timeout (15)
-T qs TCP/TPI Q,St (s) info
-g [s] exclude(^)|select and print process group IDs
-i i select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
|-r [t[m]] repeat every t seconds (15); until no files, - forever.
An optional suffix to t is m; m must separate t from and
is an strftime(3) format for the marker line.
-s p:s exclude(^)|select protocol (p = TCP|UDP) states by name(s).
-u s exclude(^)|select login|UID set s
-x [fl] cross over d| D File systems or symbolic Links
names select named files or files on named file systems
Anyone can list all files; /dev warnings disabled; kernel ID check disabled.
$
Чтобы проверить подробную информацию об установленной версии, используйте:
$ lsof -v
lsof version information:
revision: 4.87
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
constructed: Tue Oct 30 16:28:19 UTC 2018
constructed by and on: [email protected]
compiler: cc
compiler version: 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
compiler flags: -DLINUXV=310000 -DGLIBCV=217 -DHASIPv6 -DHASSELINUX -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DHAS_STRFTIME -DLSOF_VSTR="3.10.0" -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic
loader flags: -L./lib -llsof -lselinux
system info: Linux x86-01.bsys.centos.org 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Anyone can list all files.
/dev warnings are disabled.
Kernel ID check is disabled.
$
Поля вывода
Структура вывода lsof по умолчанию выглядит так:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Большинство из этих полей говорят за себя, исключением можно назвать FD
и TYPE
поля, которые несколько уникальны для LSOF и будут кратко рассмотрены ниже.
FD
относится к номеру дескриптора файла файла, TYPE
относится к типу узла, связанного с файлом. Теперь мы рассмотрим поддерживаемые значения для обоих этих полей.
FD
поле может содержать следующие значения:
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
FD
После поля следует один или несколько символов, описывающих режим, в котором открыт файл:
r for read access;
w for write access;
u for read and write access;
space if mode unknown and no lock character follows;
`-' if mode unknown and lock character follows.
За символом режима для FD
последующего может следовать LOCK
символ, описание которого приведено ниже:
N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part of the file;
X for an SCO OpenServer Xenix lock on the entire file;
space if there is no lock.
TYPE
поле может содержать GDIR, GREG, VDIR, VREG, IPV4, IPV6
и т. д. Чтобы получить полный список поддерживаемых TYPE
в lsof, обратитесь к его man
странице.
Обычное использование
Вот несколько примеров популярного использования команды lsof. Команда работает в разных версиях Linux, и все аргументы командной строки, перечисленные ниже в примерах, должны работать на всех платформах с одной и той же версией lsof.
Список всех открытых файлов
Запуск lsof без каких-либо параметров отобразит все файлы, открытые в данный момент активными процессами.
$ sudo lsof | less
Вывод:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 root rtd DIR 253,0 224 64 /
systemd 1 root txt REG 253,0 1632776 308905 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20064 16063 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265576 186547 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 16051 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 157424 16059 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,0 23968 59696 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 402384 16039 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,0 142144 15699 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,0 88720 84 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,0 43712 15703 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,0 277808 229793 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,0 91800 76005 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,0 127184 59698 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,0 61680 229827 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,0 20048 59690 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,0 155744 16048 /usr/lib64/libselinux.so.1
Список по имени файла
Чтобы перечислить все процессы, открывшие определенный файл, мы можем указать file-name
в качестве аргумента:
$ sudo lsof {file-name}
Вывод:
$ sudo lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1000 root 6w REG 253,0 205 16777741 /var/log/messages
$
Список открытых файлов по имени пользователя
В многопользовательской системе вы можете фильтровать список файлов по определенным процессам, принадлежащим пользователям, используя флаг -u, за которым следует username
.
$ sudo lsof -u {username}
Вывод:
$ sudo lsof -u xakinfo
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1239 xakinfo cwd DIR 253,0 224 64 /
sshd 1239 xakinfo rtd DIR 253,0 224 64 /
sshd 1239 xakinfo txt REG 253,0 852856 425229 /usr/sbin/sshd
sshd 1239 xakinfo mem REG 253,0 15488 17204727 /usr/lib64/security/pam_lastlog.so
sshd 1239 xakinfo mem REG 253,0 15648 229829 /usr/lib64/libpam_misc.so.0.82.0
sshd 1239 xakinfo mem REG 253,0 309248 17303270 /usr/lib64/security/pam_systemd.so
sshd 1239 xakinfo mem REG 253,0 19616 17204728 /usr/lib64/security/pam_limits.so
sshd 1239 xakinfo mem REG 253,0 11168 17204726 /usr/lib64/security/pam_keyinit.so
sshd 1239 xakinfo mem REG 253,0 40800 17204735 /usr/lib64/security/pam_namespace.so
В качестве альтернативы, если вы хотите перечислить файлы, которые открываются любым пользователем, кроме определенного, используйте -u
флаг, за которым следует, ^username
как показано ниже:
$ sudo lsof -u ^{username}
Вывод:
$ sudo lsof -u ^root
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem 630 dbus cwd DIR 253,0 224 64 /
dbus-daem 630 dbus rtd DIR 253,0 224 64 /
dbus-daem 630 dbus txt REG 253,0 223232 50590133 /usr/bin/dbus-daemon
dbus-daem 630 dbus mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
dbus-daem 630 dbus mem REG 253,0 68192 59651 /usr/lib64/libbz2.so.1.0.6
dbus-daem 630 dbus mem REG 253,0 90248 16051 /usr/lib64/libz.so.1.2.7
dbus-daem 630 dbus mem REG 253,0 99944 59680 /usr/lib64/libelf-0.176.so
dbus-daem 630 dbus mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
dbus-daem 630 dbus mem REG 253,0 402384 16039 /usr/lib64/libpcre.so.1.2.0
Один из способов использования lsof — это ситуации, когда вы хотите быстро убить все процессы определенного пользователя с помощью одной команды. Для достижения этой цели мы можем комбинировать kill
с lsof
как показано в примере ниже (выполнять от пользователя root):
# kill -9 `lsof -t -u {username}`
Как видно из приведенного выше примера, мы можем использовать -t
флаг для фильтрации всей другой информации, кроме process-id
. Это может быть полезно при автоматизации и написании сценариев, как показано в предыдущем примере, в сочетании с kill
командой.
$ sudo lsof -t -u {username}
Вывод:
$ sudo lsof -t -u xakinfo
1239
1240
$
С помощью lsof мы можем комбинировать несколько аргументов, используя OR
логику, как показано ниже:
$ sudo lsof -u {username} -c {process-name}
Вывод:
$ sudo lsof -u ftpuser -c bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1240 xakinfo cwd DIR 253,0 120 510681 /home/xakinfo
bash 1240 xakinfo rtd DIR 253,0 224 64 /
bash 1240 xakinfo txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1240 xakinfo mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1240 xakinfo mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1240 xakinfo mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1240 xakinfo mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1240 xakinfo mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1240 xakinfo mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1240 xakinfo mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1240 xakinfo 0u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 xakinfo 1u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 xakinfo 2u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 xakinfo 255u CHR 136,0 0t0 3 /dev/pts/0
bash 1425 ftpuser cwd DIR 253,0 182 33578272 /home/ftpuser
bash 1425 ftpuser rtd DIR 253,0 224 64 /
bash 1425 ftpuser txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1425 ftpuser mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1425 ftpuser mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1425 ftpuser mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1425 ftpuser mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1425 ftpuser mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1425 ftpuser mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1425 ftpuser 0u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 1u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 2u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 255u CHR 4,1 0t0 1043 /dev/tty1
$
В качестве альтернативы, если вы хотите использовать AND
логическое условие, используйте -a
флаг.
$ sudo lsof -u {username} -c {process-name} -a
Вывод:
$ sudo lsof -u ftpuser -c bash -a
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser cwd DIR 253,0 182 33578272 /home/ftpuser
bash 1425 ftpuser rtd DIR 253,0 224 64 /
bash 1425 ftpuser txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1425 ftpuser mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1425 ftpuser mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1425 ftpuser mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1425 ftpuser mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1425 ftpuser mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1425 ftpuser mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1425 ftpuser 0u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 1u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 2u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 255u CHR 4,1 0t0 1043 /dev/tty1
$
Список открытых файлов по процессам
Мы также можем перечислить файлы, открытые конкретным процессом, используя -c
параметр, за которым следует имя процесса.
$ sudo lsof -c {process-name}
Вывод:
$ sudo lsof -c ssh
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root cwd DIR 253,0 224 64 /
sshd 997 root rtd DIR 253,0 224 64 /
sshd 997 root txt REG 253,0 852856 425229 /usr/sbin/sshd
sshd 997 root mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
sshd 997 root mem REG 253,0 68192 59651 /usr/lib64/libbz2.so.1.0.6
sshd 997 root mem REG 253,0 99944 59680 /usr/lib64/libelf-0.176.so
sshd 997 root mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
sshd 997 root mem REG 253,0 15688 75906 /usr/lib64/libkeyutils.so.1.5
sshd 997 root mem REG 253,0 67104 186525 /usr/lib64/libkrb5support.so.0.1
Список открытых файлов по PID
В качестве альтернативы, чтобы перечислить файлы, открытые процессом, но вместо того process-name
, чтобы указать его идентификатор, вы можете использовать -p
флаг, за которым следует process-id
.
$ sudo lsof -p {process-id}
Вывод:
$ sudo lsof -p 663
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firewalld 663 root cwd DIR 253,0 224 64 /
firewalld 663 root rtd DIR 253,0 224 64 /
firewalld 663 root txt REG 253,0 7144 50491220 /usr/bin/python2.7
firewalld 663 root mem REG 253,0 298828 50617647 /usr/lib64/girepository-1.0/NM-1.0.typelib
firewalld 663 root mem REG 253,0 343452 50507562 /usr/lib64/girepository-1.0/Gio-2.0.typelib
firewalld 663 root mem REG 253,0 12352 17202092 /usr/lib64/python2.7/lib-dynload/grpmodule.so
firewalld 663 root mem REG 253,0 29184 17202105 /usr/lib64/python2.7/lib-dynload/selectmodule.so
firewalld 663 root mem REG 253,0 168312 388240 /usr/lib64/libdbus-glib-1.so.2.2.2
firewalld 663 root mem REG 253,0 11976 34028597 /usr/lib64/python2.7/site-packages/_dbus_glib_bindings.so
firewalld 663 root mem REG 253,0 185712 50507559 /usr/lib64/girepository-1.0/GLib-2.0.typelib
- Если вы хотите перечислить все открытые файлы, кроме тех, которые были открыты определенным процессом, используйте,
-p
а затем^process-id
.
$ sudo lsof -p ^{process-id}
Список открытых файлов, содержащих каталог
Чтобы перечислить процессы, открывшие файлы в определенном каталоге, используйте D
параметр, за которым следует путь к каталогу.
$ sudo lsof D {path}
Вывод:
$ sudo lsof D /var/log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
auditd 607 root 5w REG 253,0 1065095 425227 /var/log/audit/audit.log
firewalld 663 root 3w REG 253,0 13817 17663786 /var/log/firewalld
tuned 999 root 3w REG 253,0 13395 33574994 /var/log/tuned/tuned.log
rsyslogd 1000 root 6w REG 253,0 4302 16777753 /var/log/cron
rsyslogd 1000 root 7w REG 253,0 64740 16777755 /var/log/messages
rsyslogd 1000 root 8w REG 253,0 5513 16787904 /var/log/secure
rsyslogd 1000 root 9w REG 253,0 198 16777754 /var/log/maillog
$
Если вы не хотите рекурсивно перечислять файлы внутри подкаталогов, используйте -d
флаг, за которым следует путь к каталогу.
$ sudo lsof d {path}
Вывод:
$ sudo lsof d /var/log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firewalld 663 root 3w REG 253,0 13817 17663786 /var/log/firewalld
rsyslogd 1000 root 6w REG 253,0 4302 16777753 /var/log/cron
rsyslogd 1000 root 7w REG 253,0 64740 16777755 /var/log/messages
rsyslogd 1000 root 8w REG 253,0 5833 16787904 /var/log/secure
rsyslogd 1000 root 9w REG 253,0 198 16777754 /var/log/maillog
$
Режим повторения
lsof можно запустить в режиме повтора. В режиме повтора lsof генерирует и распечатывает вывод через равные промежутки времени. Опять же, LSOF поддерживает два режима повторения, то есть с флагами -r и r. С флагом -r lsof повторяется до тех пор, пока не получит от пользователя сигнал прерывания / уничтожения, а с флагом rs lsof Repeat режим завершается, как только в его выводе нет открытых файлов. В качестве альтернативы мы можем указать время задержки с помощью флага -r или r.
$ sudo lsof {arguments} -r{time-interval}
Вывод:
$ sudo lsof -u ftpuser -c bash D /usr/lib -a -r3
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
Список открытых файлов по сетевому протоколу
lsof поддерживает список всех типов файлов Linux, включая сетевые сокеты и т.д. Таким образом, мы можем перечислить детали открытых сетевых подключений, используя -i
флаг.
$ sudo lsof -i
Вывод:
$ sudo lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 xakinfo 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$
Чтобы перечислить все сетевые подключения, используемые конкретным пользователем process-id
, вы можете использовать lsof как:
$ sudo lsof -i -a -p {process-id}
Вывод:
$ sudo lsof -i -a -p 997
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
$
Или, чтобы перечислить все сетевые соединения, используемые определенным процессом, мы можем дать следующее process-name
:
$ sudo lsof -i -a -c {process-name}
Вывод:
$ sudo lsof -i -a -c ssh
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 xakinfo 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$
Мы можем фильтровать вывод LSOF с -i
флагом по типу сетевого протокола, то есть, TCP
или UDP
путем указания типа протокола.
$ sudo lsof -i {protocol}
Вывод:
$ sudo lsof -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 xakinfo 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$
ИЛИ ЖЕ
Вывод:
$ sudo lsof -i udp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
$
Список открытых файлов по портам
Мы также можем фильтровать вывод lsof с помощью -i
флага, port number
используя синтаксис команды, как показано ниже:
$ sudo lsof -i :{port-number}
Вывод:
$ sudo lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 xakinfo 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$
Список открытых файлов по IPv4/IPv6
Существует возможность фильтровать список сетевых подключений, ограничивая его IPv4 или IPv6. Используйте приведенный ниже синтаксис команды, чтобы получить только список IPv4:
$ sudo lsof -i4
Вывод:
$ sudo lsof -i4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 xakinfo 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$
ИЛИ, чтобы получить информацию только о IPv6, используйте:
$ sudo lsof -i6
Вывод:
$ sudo lsof -i6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
$
Список открытых файлов в NFS
lsof также может вывести список всех файлов NFS, открытых в данный момент пользователем.
$ sudo lsof -N -u xakinfo -a
Список заблокированных удаленных файлов
Иногда бывает, что в Linux файлы удаляются, но остаются заблокированными одним или несколькими процессами. Таким образом, эти файлы не отображаются в обычном списке файловой системы с помощью команды ls и т. д. Но они по-прежнему занимают дисковое пространство, как указано в выводе df, особенно это происходит с большими файлами, удаленными для очистки дискового пространства без разблокировки процесс. Вы можете найти такие процессы, используя lsof, например:
$ sudo lsof {path} | grep deleted
Вывод:
$ sudo lsof / | grep deleted
firewalld 654 root 8u REG 253,0 4096 16777726 /tmp/#16777726 (deleted)
tuned 968 root 8u REG 253,0 4096 16777720 /tmp/#16777720 (deleted)
$
Заключение
В конце статьи можно сформулировать следующий вывод: поскольку файл и процесс — два ключевых понятия операционной системы, утилита lsof может стать незаменимым помощником администратора в тех случаях, когда необходимо понять, как работает система, и особенно в случаях, когда система взломана. И чем она полезнее, тем больше ваша система и чем больше вы с ней работаете, тем лучше понимаете, на что она способна. Освоив ее возможности, вы сможете создавать отдельные сценарии для обработки огромного количества информации, которую производит эта программа. Например, вы можете регулярно запускать команду lsof -i для сравнения полученных данных. Если есть различия в количестве открытых процессов или другие различия, соответствующие указанным критериям, сценарий может сгенерировать сообщение администратору.
Мы рассмотрели только малую часть возможностей этой утилиты. Более подробную информацию ищите на соответствующей man-страничке.
Можно еще отметить, что для lsof разработана графическая оболочка, называемая GLSOF. Ее можно получить с сайта http://glsof.sourceforge.net/.