18 быстрых примеров команды lsof для любителей Linux

infoitcomua

18 быстрых примеров команды lsof для любителей Linux

 

lsof — это утилита командной строки для всех Unix и Linux подобных операционных систем для проверки « списка открытых файлов » Само название «lsof» происходит от этой функции. Команда lsof в основном используется для получения информации о файлах, которые открываются различными процессами. Открытые файлы в системе могут быть разных типов, например, дисковые файлы, сетевые сокеты, именованные каналы и устройства. Эта отличительная особенность позволяет лучше отлаживать и понимать операционную систему Linux.

Когда мы выполняем минимальную установку CentOS / RHEL / Ubuntu / OpenSUSE , lsof не является частью установки по умолчанию, поэтому используйте следующую команду для установки команды или утилиты lsof

 

Для системы CentOS / RHEL,

~] # yum install lsof -y

Системы на основе Debian (Ubuntu / Linux Mint)

~] # apt install lsof -y

Для системы OpenSUSE,

~] # zypper install lsof

Команда «lsof» имеет множество опций и переключателей. Будет очень интересно изучить некоторые из этих важных. В этой статье мы обсудим 18 полезных примеров команды lsof для гиков Linux.

Пример: 1) Список всех открытых файлов вашей системы (lsof)

Выполнение команды lsof без каких-либо параметров выведет список всех открытых файлов вашей системы, принадлежащих всем активным процессам.

Просто набрав команду «lsof» без каких-либо параметров в командной строке, вы получите следующий результат:

Примечание . — Поскольку вывод lsof предоставляет много информации для STDOUT, лучше использовать вертикальную черту «|» операция, чтобы просмотреть этот вывод постранично.

 ~]# lsof | more
COMMAND    PID  TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1         root  cwd       DIR              253,0      4096        128 /
systemd      1         root  rtd       DIR              253,0      4096        128 /
systemd      1         root  txt       REG              253,0   1489960   50674818 /usr/lib/systemd/systemd
systemd      1         root  mem       REG              253,0     20032   33628284 /usr/lib64/libuuid.so.1.3.0
systemd      1         root  mem       REG              253,0    252704   33745961 /usr/lib64/libblkid.so.1.1.0

Приведенный выше вывод команды, если вы внимательно его изучите, предоставляет много информации со многими параметрами. Например, процесс « systemd » (который является процессом демона) имеет идентификатор процесса ( PID ) «1», пользователь — « root », файловый дескриптор ( FD ) — « cwd » и т. Д. FD предлагает множество values, поскольку известно, что дескриптор файла создается для любых открытых файлов автоматически в системах Linux. Ниже приведены некоторые из хорошо известных значений «FD», используемых для команд lsof.

18 быстрых примеров команды lsof для любителей Linux

Примечание . В некоторых случаях за «mem» следует число и различные символы, такие как «r», «u», «w» и т. Д. Эти символы: «r» для чтения, «w» для записи, «u» для прочти и напиши.

Наконец, « Type » в выводе команды указывает тип файла. Ниже приведены стандартные типы файлов в системах Linux.

18 быстрых примеров команды lsof для любителей Linux

Другие поля, которые отображаются вместе с этим, следующие:

  • DEVICE –> Идентификатор устройства
  • SIZE/OFF –> Фактический размер этого процесса (взятый во время выполнения)
  • NODE –> Обычно номер inode каталога или родительского каталога
  • NAME –> Путь или ссылка

Пример: 2) Список открытых файлов определенной файловой системы (/ proc)

Как вы знаете, « /proc » будет существовать только в течение срока службы ОС Linux, этот каталог содержит много важной информации, связанной с процессами. Выполнение «lsof» в / proc даст нам интересный результат для изучения,

~]# lsof /proc
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF       NODE NAME
systemd      1 root    9r   REG    0,3        0       6690 /proc/1/mountinfo
systemd      1 root   11r   REG    0,3        0 4026532018 /proc/swaps
systemd-j  462 root   10r   REG    0,3        0       6936 /proc/sys/kernel/hostname
lsof      5186 root    3r   DIR    0,3        0          1 /proc
lsof      5186 root    6r   DIR    0,3        0      28890 /proc/5186/fd
~]#

Как упоминалось ранее, здесь фиксируется «lsof» самого «lsof», и отображаются все подробности. Помимо «lsof» существуют другие процессы, такие как systemd и rsyslogd, которые являются демонами, используемыми для свопинга, монтирования и т. Д.

Точно так же мы можем перечислить открытые файлы другой файловой системы, например /var/log,

 ~]# lsof /var/log/

Команда lsof становится очень удобной в ситуации, когда команды df и du показывают разное использование диска одной и той же файловой системы, с помощью команды lsof мы можем найти файлы, которые были удалены, когда они были открыты и использовались каким-то процессом,

~]# lsof /var/log | grep -i "deleted"

Вышеупомянутая команда предоставит вам pid файлов, которые были удалены, но все еще существуют в системе в удаленном состоянии. Итак, чтобы освободить место в файловой системе, мы можем безопасно убить процесс по его pid.

Пример: 3) Список открытых файлов для команды «lsof»

Само «lsof» выдает сообщение об ошибке,

~]# lsof lsof
lsof: status error on lsof: No such file or directory
lsof 4.87

Пример: 4) Список открытых файлов для пользователей (lsof -u <user_name>)

«Lsof» можно использовать для всех пользователей, вошедших в систему Linux. В этом случае «lsof» отобразит все открытые файлы для соответствующего пользователя.

Список всех открытых файлов для пользователя root

 ~]# lsof -u root | more
COMMAND    PID USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1 root  cwd       DIR              253,0      4096        128 /
systemd      1 root  rtd       DIR              253,0      4096        128 /
systemd      1 root  txt       REG              253,0   1620416   51034677 /usr/lib/systemd/systemd
systemd      1 root  mem       REG              253,0     20032   33628284 /usr/lib64/libuuid.so.1.3.0
systemd      1 root  mem       REG              253,0    252704   33745961 /usr/lib64/libblkid.so.1.1.0
systemd      1 root  mem       REG              253,0     90632   33628275 /usr/lib64/libz.so.1.2.7
systemd      1 root  mem       REG              253,0    153192   33618596 /usr/lib64/liblzma.so.5.0.99
systemd      1 root  mem       REG              253,0     19888   33656455 /usr/lib64/libattr.so.1.1.0
…………………………………………………………

Список открытых файлов для пользователей без полномочий root, давайте посмотрим все открытые файлы для пользователя infoit,

~]# lsof -u infoit  | more
Или
~]# lsof -l -u infoit | more
COMMAND    PID       USER   FD   TYPE             DEVICE  SIZE/OFF     NODE NAME
sshd      2657 infoit  cwd    DIR              253,0      4096      128 /
sshd      2657 infoit  rtd    DIR              253,0      4096      128 /
sshd      2657 infoit  txt    REG              253,0    815520 34698340 /usr/sbin/sshd
sshd      2657 infoit  DEL    REG                0,4              23850 /dev/zero
sshd      2657 infoit  mem    REG              253,0     15472 33831639 /usr/lib64/security/pam_lastlog.so
sshd      2657 infoit  mem    REG              253,0     68192 33628305 /usr/lib64/libbz2.so.1.0.6
sshd      2657 infoit  mem    REG              253,0    153192 33618596 /usr/lib64/liblzma.so.5.0.99
sshd      2657 infoit  mem    REG              253,0     91496 33628319 /usr/lib64/libelf-0.163.so
sftp-serv 2661 infoit  mem    REG              253,0     14608 33618582 /usr/lib64/libutil-2.17.so
sftp-serv 2661 infoit  mem    REG              253,0     61856 33863972 /usr/lib64/liblber-2.4.so.2.10.3
sftp-serv 2661 infoit  mem    REG              253,0    344224 33863974 /usr/lib64/libldap-2.4.so.2.10.3
sftp-serv 2661 infoit  mem    REG              253,0     19512 33618298 /usr/lib64/libdl-2.17.so
sftp-serv 2661 infoit  mem    REG              253,0   2516624 33657314 /usr/lib64/libcrypto.so.1.0.2k
sftp-serv 2661 infoit  mem    REG              253,0    164432 33618285 /usr/lib64/ld-2.17.so
sftp-serv 2661 infoit  0r     FIFO                0,8       0t0    24046 pipe
sftp-serv 2661 infoit  1w     FIFO                0,8       0t0    24047 pipe
sftp-serv 2661 infoit  2w     FIFO                0,8       0t0    24048 pipe
bash      2670 infoit  cwd    DIR              253,0        79 17157147 /home/infoit
………………………………………………………………………

Чтобы вывести список всех открытых файлов, кроме пользователя root, используйте ^ (символ каретки) перед пользователем root (lsof -u ^ root),

~]# lsof -u ^root | more
COMMAND    PID  TID       USER   FD      TYPE             DEVICE  SIZE/OFF     NODE NAME
dbus-daem 1662            dbus  cwd       DIR              253,0      4096      128 /
dbus-daem 1662            dbus  rtd       DIR              253,0      4096      128 /
dbus-daem 1662            dbus  txt       REG              253,0    441176 17133533 /usr/bin/dbus-daemon
dbus-daem 1662            dbus  mem       REG              253,0     57824 33618566 /usr/lib64/libnss_files-2.17.so
dbus-daem 1662            dbus  mem       REG              253,0     19512 33618298 /usr/lib64/libdl-2.17.so
dbus-daem 1662            dbus  mem       REG              253,0    398272 33628261 /usr/lib64/libpcre.so.1.2.0
dbus-daem 1662            dbus  mem       REG              253,0   2107816 33618292 /usr/lib64/libc-2.17.so
……………………………………………………………………………………………………………

Пример: 5) Список всех открытых файлов Интернета и домена UNIX (lsof -i -U)

Используйте параметр «-i -U» в команде lsof для вывода списка всех открытых файлов Интернета и домена UNIX в вашей системе, пример показан ниже.

~]# lsof -i -U
COMMAND    PID       USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
systemd      1       root   12u  unix 0xffff8800b8baab40      0t0 11075 /run/systemd/cgroups-agent
systemd      1       root   13u  unix 0xffff8800b8bab2c0      0t0 11077 /run/systemd/private
systemd      1       root   42u  IPv4              16576      0t0   TCP *:sunrpc (LISTEN)
systemd      1       root   43u  IPv4              16577      0t0   UDP *:sunrpc
rpcbind   1633        rpc    3u  unix 0xffff8800bab8cf00      0t0 16574 /var/run/rpcbind.sock
rpcbind   1633        rpc    4u  IPv4              16576      0t0   TCP *:sunrpc (LISTEN)
rpcbind   1633        rpc    5u  IPv4              16577      0t0   UDP *:sunrpc
rpcbind   1633        rpc    6u  IPv6              16578      0t0   TCP *:sunrpc (LISTEN)
rpcbind   1633        rpc    7u  IPv6              16579      0t0   UDP *:sunrpc
rpcbind   1633        rpc   10u  IPv4              16649      0t0   UDP *:960
sshd      2532       root    3u  IPv4              21120      0t0   TCP 192.168.1.6:ssh->192.168.1.5:65110 (ESTABLISHED)
sshd      2532       root    4u  unix 0xffff8800bbef3a40      0t0 21260 socket
sshd      2532       root    8u  unix 0xffff8800b8afd680      0t0 21298 /tmp/ssh-QHz9BdtRvt/agent.2532
sshd      2536       root    3u  IPv4              21191      0t0   TCP 192.168.1.6:ssh->192.168.1.5:65112 (ESTABLISHED)
sshd      2536       root    4u  unix 0xffff8800b8afd2c0      0t0 21363 socket
………………………………………………………………………………………………………………

Пример: 6) Список всех открытых сетевых файлов IPv4 (lsof -i 4)

Используйте опцию «-i -4» в команде lsof, чтобы вывести список всех открытых сетевых файлов для IPv4,

 ~]# lsof -i 4
COMMAND   PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd     1       root   42u  IPv4  16576      0t0  TCP *:sunrpc (LISTEN)
systemd     1       root   43u  IPv4  16577      0t0  UDP *:sunrpc
rpcbind  1633        rpc    4u  IPv4  16576      0t0  TCP *:sunrpc (LISTEN)
sshd     2258       root    3u  IPv4  19493      0t0  TCP *:ssh (LISTEN)
master   2360       root   13u  IPv4  20087      0t0  TCP localhost:smtp (LISTEN)
dhclient 2494       root    6u  IPv4  20983      0t0  UDP *:bootpc
dhclient 2494       root   20u  IPv4  20951      0t0  UDP *:24884
dhclient 2514       root    6u  IPv4  20866      0t0  UDP *:bootpc
sshd     2532       root    3u  IPv4  21120      0t0  TCP 192.168.1.6:ssh->192.168.1.5:65110 (ESTABLISHED)
sshd     2536       root    3u  IPv4  21191      0t0  TCP 192.168.1.6:ssh->192.168.1.5:65112 (ESTABLISHED)
sshd     2621       root    3u  IPv4  23506      0t0  TCP 192.168.1.6:ssh->192.168.1.9:65422 (ESTABLISHED)
sshd     2655       root    3u  IPv4  23863      0t0  TCP 192.168.1.6:ssh->192.168.1.9:49992 (ESTABLISHED)
sshd     2657 infoit    3u  IPv4  23795      0t0  TCP 192.168.1.6:ssh->192.168.1.9:49990 (ESTABLISHED)
sshd     2660 infoit    3u  IPv4  23863      0t0  TCP 192.168.1.6:ssh->192.168.1.9:49992 (ESTABLISHED)
 ~]#

Чтобы перечислить все открытые сетевые файлы IPv4, используемые определенным процессом, чей идентификатор процесса «any_number», приведены ниже.

Предположим, мы хотим перечислить все сетевые файлы IPv4 для процесса rpcbind.

Синтаксис : # lsof i 4 -a -p {process_pid}

 ~]# lsof -i 4 -a  -p 1633
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1633  rpc    4u  IPv4  16576      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1633  rpc    5u  IPv4  16577      0t0  UDP *:sunrpc
rpcbind 1633  rpc   10u  IPv4  16649      0t0  UDP *:960
 ~]#

Пример: 7) Список всех открытых сетевых файлов для IPv6 (lsof -i 6)

Предполагая, что домен ipv6 поддерживается, вывод lsof будет примерно таким, как показано ниже:

 ~]# lsof -i 6
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd     1   root   44u  IPv6  16578      0t0  TCP *:sunrpc (LISTEN)
systemd     1   root   46u  IPv6  16579      0t0  UDP *:sunrpc
rpcbind  1633    rpc    6u  IPv6  16578      0t0  TCP *:sunrpc (LISTEN)
rpcbind  1633    rpc    7u  IPv6  16579      0t0  UDP *:sunrpc
rpcbind  1633    rpc   11u  IPv6  16650      0t0  UDP *:960
sshd     2258   root    4u  IPv6  19504      0t0  TCP *:ssh (LISTEN)
master   2360   root   14u  IPv6  20088      0t0  TCP localhost:smtp (LISTEN)
dhclient 2494   root   21u  IPv6  20952      0t0  UDP *:16498
dhclient 2514   root   21u  IPv6  20823      0t0  UDP *:34955
httpd    2594   root    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd    2595 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd    2596 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd    2597 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd    2598 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd    2599 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
~]#

Пример: 8) Список всех процессов TCP и UDP, запущенных на определенном порту (lsof -i TCP / UDP: порт)

Предположим, мы хотим вывести список всех TCP-процессов, запущенных на 80-м порту, используйте следующую команду

~]# lsof -i TCP:80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   2594   root    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2595 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2596 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2597 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2598 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
httpd   2599 apache    4u  IPv6  22703      0t0  TCP *:http (LISTEN)
~]#

Чтобы вывести список всех открытых файлов на TCP-порту из диапазона портов (от 1 до 1048), используйте следующую команду

~]# lsof -i TCP:1-1048
COMMAND  PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd    1       root   41u  IPv4  16863      0t0  TCP *:sunrpc (LISTEN)
systemd    1       root   44u  IPv6  16865      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1663        rpc    4u  IPv4  16863      0t0  TCP *:sunrpc (LISTEN)
rpcbind 1663        rpc    6u  IPv6  16865      0t0  TCP *:sunrpc (LISTEN)
sshd    2294       root    3u  IPv4  19949      0t0  TCP *:ssh (LISTEN)
sshd    2294       root    4u  IPv6  19965      0t0  TCP *:ssh (LISTEN)
master  2433       root   13u  IPv4  21026      0t0  TCP localhost:smtp (LISTEN)
master  2433       root   14u  IPv6  21027      0t0  TCP localhost:smtp (LISTEN)
sshd    2600       root    3u  IPv4  21737      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52393 (ESTABLISHED)
sshd    2659       root    3u  IPv4  22056      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52486 (ESTABLISHED)
sshd    2663       root    3u  IPv4  22123      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52489 (ESTABLISHED)
httpd   2837       root    4u  IPv6  26112      0t0  TCP *:http (LISTEN)
httpd   2838     apache    4u  IPv6  26112      0t0  TCP *:http (LISTEN)
httpd   2839     apache    4u  IPv6  26112      0t0  TCP *:http (LISTEN)
httpd   2840     apache    4u  IPv6  26112      0t0  TCP *:http (LISTEN)
httpd   2841     apache    4u  IPv6  26112      0t0  TCP *:http (LISTEN)
httpd   2842     apache    4u  IPv6  26112      0t0  TCP *:http (LISTEN)
sshd    2891       root    3u  IPv4  26896      0t0  TCP 192.168.1.3:ssh->192.168.1.9:53541 (ESTABLISHED)
sshd    2895 infoit    3u  IPv4  26896      0t0  TCP 192.168.1.3:ssh->192.168.1.9:53541 (ESTABLISHED)
~]#

Чтобы вывести список всех процессов UDP, запущенных на определенном порту, используйте следующую команду

~]# lsof -i UDP:16498
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dhclient 2494 root   21u  IPv6  20952      0t0  UDP *:16498
~]#

Примечание . Чтобы вывести список всех открытых процессов UDP в вашей системе Linux, используйте команду « lsof -i UDP ».

Пример: 9) Список всех открытых файлов для определенного устройства (lsof <device_name>)

Следующая команда может использоваться для вывода списка всех открытых файлов на / dev / vda1.

Примечание: в этом случае тип устройства является виртуальным, обычно это может быть тип / dev / hd <number> / sd {number}

 ~]# lsof  /dev/vda1 | more
COMMAND    PID       USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
systemd      1       root  cwd    DIR  253,1     4096       2 /
systemd      1       root  rtd    DIR  253,1     4096       2 /
systemd      1       root  txt    REG  253,1  1577264  262271 /lib/systemd/systemd
systemd      1       root  mem    REG  253,1    18976  262252 /lib/x86_64-linux-gnu/libuuid.so.1.3.0
systemd      1       root  mem    REG  253,1   262408  262245 /lib/x86_64-linux-gnu/libblkid.so.1.1.0
systemd      1       root  mem    REG  253,1    14608  266364 /lib/x86_64-linux-gnu/libdl-2.23.so
systemd      1       root  mem    REG  253,1   456632  262207 /lib/x86_64-linux-gnu/libpcre.so.3.13.2
systemd      1       root  mem    REG  253,1  1868984  266362 /lib/x86_64-linux-gnu/libc-2.23.so
systemd      1       root  mem    REG  253,1   138696  266361 /lib/x86_64-linux-gnu/libpthread-2.23.so
systemd      1       root  mem    REG  253,1   286824  261756 /lib/x86_64-linux-gnu/libmount.so.1.1.0

Пример: 10) Список процессов с открытыми файлами в файловой системе NFS

Бывают ситуации, когда вы смонтировали файловую систему nfs на свой Linux-сервер, но сервер nfs недоступен и вы хотите вывести список всех процессов с открытыми файлами в этой файловой системе nfs,

~]# lsof -b <nfs-share-mount-point>

Пример: 11) Список открытых файлов, связанных с терминалом (lsof / dev / tty {number})

Следующая команда используется для всех открытых файлов на / dev / tty1.

Примечание . В этом случае тип терминала — «tty1». Также можно использовать любой другой тип терминала, например / dev / tty <number>

~]# lsof /dev/tty1
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    2442 root    0u   CHR    4,1      0t0 4689 /dev/tty1
bash    2442 root    1u   CHR    4,1      0t0 4689 /dev/tty1
bash    2442 root    2u   CHR    4,1      0t0 4689 /dev/tty1
bash    2442 root  255u   CHR    4,1      0t0 4689 /dev/tty1
~]#

Пример: 12) Список PID, имени команды, дескриптора файла, номера устройства и номера индексного дескриптора файла (lsof -FpcfDi)

Один из интересных вариантов в «lsof» для получения вывода поля PID (P) и имени команды (c) для каждого процесса, дескриптора файла (f), номера файлового устройства (D) и номера индексного дескриптора файла (i) для каждого файла. Пример каждого процесса показан ниже

 ~]# lsof -FpcfDi | more
p1
csystemd
fcwd
D0xfd00
i128
frtd
D0xfd00
i128
ftxt
D0xfd00
i51034677
fmem
D0xfd00
i33628284
………………

Примечание. Отображается длинный список вывода, но он сокращен для экономии места.

Пример: 13) Список всех сетевых подключений (lsof -i)

Используйте опцию «-i» в команде lsof, чтобы вывести список всех связанных с сетью процессов или команд, пример показан ниже,

 ~]# lsof -i
COMMAND    PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd      1       root   41u  IPv4  16863      0t0  TCP *:sunrpc (LISTEN)
systemd      1       root   43u  IPv4  16864      0t0  UDP *:sunrpc
rpcbind   1663        rpc    4u  IPv4  16863      0t0  TCP *:sunrpc (LISTEN)
rpcbind   1663        rpc    5u  IPv4  16864      0t0  UDP *:sunrpc
rpcbind   1663        rpc   11u  IPv6  17051      0t0  UDP *:988
sshd      2294       root    3u  IPv4  19949      0t0  TCP *:ssh (LISTEN)
sshd      2294       root    4u  IPv6  19965      0t0  TCP *:ssh (LISTEN)
rpc.statd 2300    rpcuser   10u  IPv6  19974      0t0  UDP *:48486
rpc.statd 2300    rpcuser   11u  IPv6  20045      0t0  TCP *:39334 (LISTEN)
rpc.mount 2311       root    7u  IPv4  19897      0t0  UDP *:mountd
rpc.mount 2311       root    8u  IPv4  19911      0t0  TCP *:mountd (LISTEN)
master    2433       root   13u  IPv4  21026      0t0  TCP localhost:smtp (LISTEN)
master    2433       root   14u  IPv6  21027      0t0  TCP localhost:smtp (LISTEN)
dhclient  2563       root    6u  IPv4  21589      0t0  UDP *:bootpc
dhclient  2583       root   21u  IPv6  21365      0t0  UDP *:10368
sshd      2600       root    3u  IPv4  21737      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52393 (ESTABLISHED)
sshd      2659       root    3u  IPv4  22056      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52486 (ESTABLISHED)
~]#

Пример: 14) Найдите файл сокета IPv4 / IPv6

Чтобы найти файл сокета IPv4, используйте следующую команду, замените IP-адрес на IP-адрес вашей системы.

 ~]# lsof -i@192.168.1.3
COMMAND  PID       USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    2600       root    3u  IPv4  21737      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52393 (ESTABLISHED)
sshd    2659       root    3u  IPv4  22056      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52486 (ESTABLISHED)
sshd    2663       root    3u  IPv4  22123      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52489 (ESTABLISHED)
sshd    2724       root    3u  IPv4  25004      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52848 (ESTABLISHED)
sshd    2728 infoit    3u  IPv4  25004      0t0  TCP 192.168.1.3:ssh->192.168.1.9:52848 (ESTABLISHED)
 ~]#

Чтобы найти файл сокета IP версии 6 по соответствующему числовому адресу в форме двоеточия, в котором есть ряд нулей — например, адрес обратной связи (127.0.0.1), используйте команду и параметры ниже:

 ~]# lsof -i@[::1]
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
master  2433 root   14u  IPv6  21027      0t0  TCP localhost:smtp (LISTEN)
 ~]#

Пример: 15) Список всех процессов или команд, принадлежащих идентификатору процесса (lsof -p <pid>)

Предположим, мы хотим перечислить все процессы или команды, принадлежащие определенному идентификатору процесса. Пример показан ниже.

 ~]# lsof -p 2842 | more
COMMAND  PID   USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
httpd   2842 apache  cwd       DIR              253,0     4096      128 /
httpd   2842 apache  rtd       DIR              253,0     4096      128 /
httpd   2842 apache  txt       REG              253,0   523680 34641136 /usr/sbin/httpd
httpd   2842 apache  mem       REG              253,0   110808 33618576 /usr/lib64/libresolv-2.17.so
httpd   2842 apache  mem       REG              253,0    27512 33618564 /usr/lib64/libnss_dns-2.17.so
httpd   2842 apache  mem       REG              253,0    57824 33618566 /usr/lib64/libnss_files-2.17.so
httpd   2842 apache  mem       REG              253,0    27808 17080385 /usr/lib64/httpd/modules/mod_cgi.so
httpd   2842 apache  mem       REG              253,0    68192 33628305 /usr/lib64/libbz2.so.1.0.6
………………………………………………

Пример: 16) Убить все процессы, принадлежащие определенному пользователю.

Команда lsof становится очень удобной, когда мы хотим убить весь процесс, принадлежащий определенному пользователю, в приведенном ниже примере будет уничтожен весь процесс, принадлежащий пользователю infoit.

~]# kill -9 `lsof -t -u infoit`
~]#

Пример: 17) Список всех открытых файлов в определенном каталоге (lsod + D <directory-path>)

Предположим, мы хотим перечислить все открытые файлы в каталоге / var / log, а затем использовать следующую команду lsof,

 ~]# lsof +D /var/log/
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
auditd    1635   root    4w   REG  253,0  1177238 51031316 /var/log/audit/audit.log
wpa_suppl 1840   root    3w   REG  253,0      240   392280 /var/log/wpa_supplicant.log
tuned     2295   root    3w   REG  253,0     6000 17713597 /var/log/tuned/tuned.log
rsyslogd  2296   root    6w   REG  253,0     7118   392279 /var/log/cron
rsyslogd  2296   root    7w   REG  253,0   449328   338975 /var/log/messages
rsyslogd  2296   root    8w   REG  253,0    26038   338976 /var/log/secure
rsyslogd  2296   root    9w   REG  253,0     1576   338977 /var/log/maillog
rsyslogd  2296   root   10w   REG  253,0     9458      138 /var/log/boot.log
httpd     2837   root    2w   REG  253,0     2829 34768157 /var/log/httpd/error_log
httpd     2837   root    7w   REG  253,0        0 34824416 /var/log/httpd/access_log
httpd     2838 apache    2w   REG  253,0     2829 34768157 /var/log/httpd/error_log
httpd     2838 apache    7w   REG  253,0        0 34824416 /var/log/httpd/access_log
httpd     2839 apache    2w   REG  253,0     2829 34768157 /var/log/httpd/error_log
httpd     2839 apache    7w   REG  253,0        0 34824416 /var/log/httpd/access_log
httpd     2840 apache    2w   REG  253,0     2829 34768157 /var/log/httpd/error_log
httpd     2840 apache    7w   REG  253,0        0 34824416 /var/log/httpd/access_log
httpd     2841 apache    2w   REG  253,0     2829 34768157 /var/log/httpd/error_log
httpd     2841 apache    7w   REG  253,0        0 34824416 /var/log/httpd/access_log
httpd     2842 apache    2w   REG  253,0     2829 34768157 /var/log/httpd/error_log
httpd     2842 apache    7w   REG  253,0        0 34824416 /var/log/httpd/access_log
~]#

Примечание: в приведенной выше команде, если мы используем опцию + D, то lsof будет рекурсивно перечислять все открытые файлы каталога, и если вы не хотите рекурсивно перечислять открытые файлы каталога, используйте опцию «+ d».

Пример: 18) «lsof», чтобы проверить, кто открыл файл журнала (чтобы найти PID)

Следующая опция команды используется, чтобы узнать, кто открыл файл /var/log/httpd/access.log и каков PID этого процесса. А затем с помощью команды «ps -ef» мы можем найти точного пользователя

 ~]# lsof -t /var/log/httpd/access_log
3109
3110
3111
3112
3113
3114
 ~]#

~]# ps -ef | grep -E "3109|3110|3111|3112|3113|3114" | grep -v grep
or
~]# ps -fp "$(lsof -t /var/log/httpd/access_log | xargs echo)"
root      3109     1  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3110  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3111  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3112  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3113  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    3114  3109  0 03:36 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
 ~]#

Многие параметры команды «lsof» можно комбинировать для различных целей, как показано ниже, некоторые комбинации флагов «-c», «-u» и «-I». Для получения более подробной информации обратитесь к странице руководства.

 

Приведенная ниже комбинация команд каждую секунду будет выводить информацию о домашнем каталоге «infoit», который все файлы открывались повторно.

~]# lsof -u infoit -c init -a -r1
=======
COMMAND   PID       USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
inita.sh 2971 infoit  cwd    DIR    8,1     4096  393218 /home/infoit
inita.sh 2971 infoit  rtd    DIR    8,1     4096       2 /
inita.sh 2971 infoit  txt    REG    8,1    83344  524367 /bin/dash
inita.sh 2971 infoit  mem    REG    8,1  1434567 1443695 /lib/i386-linux-gnu/libc-2.13.so
……………………………………………………………………………

Заключение:

Как упоминалось во вводном разделе, «lsof» — очень мощная и полезная команда в дистрибутивах на базе Linux. Эту команду и перечисленные параметры можно использовать для различных целей, таких как отладка, устранение неполадок и сортировка процессов Linux. Упомянутые варианты и комбинации, если попробуете, помогут установить полное понимание команды «lsof». Другие команды, такие как lstat , stat и ls, также можно использовать в сочетании с командой «lsof».

Author: forgero