Использование команды lsof в Linux с примерами
lsof — это мощная утилита, доступная для систем на базе Linux и Unix, которая буквально означает «список (из) открытых файлов».
Его основная функция — получать подробную информацию о различных типах файлов, открытых разными запущенными процессами. Эти файлы могут быть обычными файлами, каталогами, файлами блоков, сетевыми сокетами, именованными каналами и так далее.
Установка lsof
lsof
не доступен по умолчанию в большинстве дистрибутивов 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 повторяется до тех пор, пока не получит от пользователя сигнал прерывания/уничтожения, а с r
флагом 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, чтобы узнать обо всех поддерживаемых аргументах и их использовании.
$ man lsof