Использование команды 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

Добавить комментарий