Применение команды lsof в Linux

Применение команды lsof в Linux

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/.

 

Click to rate this post!
[Total: 0 Average: 0]

Leave a reply:

Your email address will not be published.