Практические примеры использования lsof

Sep 22, 2016 22:35 · 1207 words · 6 minute read lsof

Утилита командной строки lsof (List Open Files) используется для получения информации об открытых различными процессами файлах (а с точки зрения unix все является файлами — каталоги, устройства, сокеты и т. д.). Давайте разберемся с практическим применением lsof!

Если ввести команду lsof без аргументов, можно увидеть все файлы, принадлежащие процессам:

lsof
COMMAND    PID                 USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
sudo       9003                root    0u      CHR              136,0       0t0          3 /dev/pts/0
sudo       9003                root    1u      CHR              136,0       0t0          3 /dev/pts/0
sudo       9003                root    2u      CHR              136,0       0t0          3 /dev/pts/0
sudo       9003                root    3u     unix 0xffff8800b9dc2040       0t0 1797950854 socket
sudo       9003                root    5u  netlink                          0t0 1797950851 AUDIT
sudo       9003                root    6r     FIFO                0,8       0t0 1797950849 pipe
sudo       9003                root    7w     FIFO                0,8       0t0 1797950849 pipe
sudo       9003                root    8u     unix 0xffff8800bad60080       0t0 1797950858 socket
bash       9004                root  cwd       DIR                8,1      4096    2495239 /home/e.lebed
bash       9004                root  rtd       DIR                8,1      4096          2 /
bash       9004                root  txt       REG                8,1   1029624    3545924 /bin/bash
bash       9004                root  mem       REG                8,1     47712    1444819 /lib/x86_64-linux-gnu/libnss_files-2.19.so
bash       9004                root  mem       REG                8,1     43592    1444834 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
bash       9004                root  mem       REG                8,1     89104    1444761 /lib/x86_64-linux-gnu/libnsl-2.19.so
bash       9004                root  mem       REG                8,1     31632    1444811 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
bash       9004                root  mem       REG                8,1   2855152    1717701 /usr/lib/locale/locale-archive
...

Большинство столбцов не нуждается в пояснении, но отдельно стоит упомянуть про FD (файловый дескриптор) и TYPE (тип файла). Файловые дескрипторы могут принимать следующие значения:

  • cwd – текущий рабочий каталог;
  • txt – текстовый файл;
  • mem – файлы, отображаемые в память;
  • mmap – устройства, отображаемые в память;
  • NUMBER – файловый дескриптор. Символ после числа показывает в каком режиме открыт файл — «r» для чтения, «w» для записи, «u» для чтения и записи.

Чаще всего встречаются такие типы файлов:

  • REG – обычный файл;
  • DIR – каталог;
  • FIFO – очередь (First In First Out);
  • CHR – специальный файл устройства.

Увидеть процессы, использующие файл можно просто передав имя файла в качестве аргумента:

lsof /var/log/syslog
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd 3481 root    6w   REG    8,1    46052 131354 /var/log/syslog

Увидеть список процессов, использующие файлы в конкретном каталоге можно с помощью опции +D:

lsof +D /var/log/
COMMAND     PID     USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
monit       603     root    3u   REG    8,1    68554 132793 /var/log/monit.log
munin-nod  2163     root    2w   REG    8,1    10583 262865 /var/log/munin/munin-node.log
munin-nod  2163     root    4w   REG    8,1    10583 262865 /var/log/munin/munin-node.log
apache2    3131     root    2w   REG    8,1      409 262714 /var/log/apache2/error.log
apache2    3131     root    9w   REG    8,1        0 262973 /var/log/apache2/other_vhosts_access.log
apache2    3131     root   10w   REG    8,1     2724 262712 /var/log/apache2/access.log
apache2    3131     root   11w   REG    8,1     2724 262712 /var/log/apache2/access.log
rsyslogd   3481     root    5w   REG    8,1  2916160 132493 /var/log/auth.log
rsyslogd   3481     root    6w   REG    8,1    47105 131354 /var/log/syslog
...

Увидеть список открытых файлов определенным процессом (или несколькими процессами) можно с помощью <имя_процесса>:

lsof -c ssh -c monit
COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
monit     603    root  cwd    DIR                8,1     4096          2 /
monit     603    root  txt    REG                8,1   547088    1711150 /usr/bin/monit
monit     603    root    3u   REG                8,1    68554     132793 /var/log/monit.log
monit     603    root    4u   REG                8,1      584     790676 /var/lib/monit/state
monit     603    root    6u  IPv4         1600503444      0t0        TCP *:2812 (LISTEN)
...
sshd     8803    root  cwd    DIR                8,1     4096          2 /
sshd     8803    root  txt    REG                8,1   787080    1710788 /usr/sbin/sshd
sshd     8803    root  mem    REG                8,1    26856    1444961 /lib/x86_64-linux-gnu/security/pam_limits.so
...

Увидеть процессы, использующие каталог (например, точку монтирования) можно так:

lsof /var/spool/asterisk
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
asterisk 20263 asterisk   35w   REG   8,17  5505068 3651513 /var/spool/asterisk/monitor/20160908-1473316827.190.wav
asterisk 20263 asterisk   44w   REG   8,17   163884 3651422 /var/spool/asterisk/monitor/20160908-1473317161.257.wav

Список файлов, открытых определенным пользователем можно так:

lsof -u e.lebed
COMMAND   PID    USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd  8821 e.lebed  cwd       DIR                8,1     4096          2 /
systemd  8821 e.lebed  txt       REG                8,1  1309064    1445800 /lib/systemd/systemd
systemd  8821 e.lebed  mem       REG                8,1    47712    1444819 /lib/x86_64-linux-gnu/libnss_files-2.19.so
systemd  8821 e.lebed    0r      CHR                1,3      0t0         18 /dev/null
systemd  8821 e.lebed    1u     unix 0xffff8800b9eba0c0      0t0 1797950604 socket
systemd  8821 e.lebed    4u     0000                0,9        0       6621 anon_inode
...

Просмотреть список файлов, использующихся конкретным процессом:

lsof -p 20263
COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
asterisk 20263 asterisk  cwd    DIR                8,1     4096          2 /
asterisk 20263 asterisk  rtd    DIR                8,1     4096          2 /
asterisk 20263 asterisk  txt    REG                8,1 12333177    1723637 /usr/sbin/asterisk
asterisk 20263 asterisk  mem    REG                8,1   277904    1723542 /usr/lib/asterisk/modules/format_wav_gsm.so
asterisk 20263 asterisk  mem    REG                8,1   453780    1723459 /usr/lib/asterisk/modules/app_dial.so
asterisk 20263 asterisk  mem    REG                8,1   227282    1723461 /usr/lib/asterisk/modules/app_dictate.so
...

Вывести только PID процесса, использующего файл:

lsof -t /var/log/syslog
3481

Зная PID процесса, можно послать ему сигнал SIGKILL. Например, чтобы убить все процессы конкретного пользователя делаем так:

kill -9 `lsof -t -u admin`

Использовать lsof можно в цикле. Этот режим включается с помощью опции -r или +r, причем дополнительно можно указать таймаут между выполнениями цикла (в секундах). Результат вывода каждого цикла будет отделен символами «=======»:

lsof -c rsyslogd -r5
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
rsyslogd 3481 root  cwd    DIR                8,1     4096          2 /
rsyslogd 3481 root  rtd    DIR                8,1     4096          2 /
rsyslogd 3481 root  txt    REG                8,1   577344    1707496 /usr/sbin/rsyslogd
...
rsyslogd 3481 root   11w   REG                8,1     4955     132477 /var/log/daemon.log
rsyslogd 3481 root   13u  IPv4              15732      0t0        UDP *:37147
rsyslogd 3481 root   15u  IPv4            8110369      0t0        UDP *:59548
=======
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
rsyslogd 3481 root  cwd    DIR                8,1     4096          2 /
rsyslogd 3481 root  rtd    DIR                8,1     4096          2 /
...

Посмотреть список окрытых сетевых соединений можно с помощью опций -i (все), -i4 (IPV4) и -i6 (IPV6):

lsof -i4
COMMAND     PID        USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
monit       603        root    6u  IPv4 1600503444      0t0  TCP *:2812 (LISTEN)
rpcbind    3355        root    6u  IPv4      12697      0t0  UDP *:sunrpc
rpcbind    3355        root    7u  IPv4      12700      0t0  UDP *:898
rpcbind    3355        root    8u  IPv4      12701      0t0  TCP *:sunrpc (LISTEN)
rpc.statd  3387       statd    5u  IPv4      12842      0t0  UDP localhost:1019
ntpd       3555         ntp   16u  IPv4      14088      0t0  UDP *:ntp
ntpd       3555         ntp   18u  IPv4      14094      0t0  UDP localhost:ntp
ntpd       3555         ntp   20u  IPv4 1365954831      0t0  UDP 192.168.2.12:ntp
exim4     10289 Debian-exim    5u  IPv4 3585448190      0t0  TCP *:smtp (LISTEN)
zabbix_ag 17057      zabbix    5u  IPv4 1604550216      0t0  TCP *:zabbix-agent (LISTEN)
asterisk  20263    asterisk    8u  IPv4 1820763379      0t0  TCP *:5038 (LISTEN)
...

Список сетевых соединений, использующих определенный порт можно увидеть так:

lsof -i :25
COMMAND   PID        USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
exim4   10289 Debian-exim    4u  IPv6 3585448189      0t0  TCP *:smtp (LISTEN)
exim4   10289 Debian-exim    5u  IPv4 3585448190      0t0  TCP *:smtp (LISTEN)

Отфильтровать открытые сетевые соединения по протоколу TCP:

lsof -i tcp
COMMAND     PID          USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
monit       603          root    6u  IPv4 1600503444      0t0  TCP *:2812 (LISTEN)
apache2    1254      www-data    4u  IPv6 1421913521      0t0  TCP *:http (LISTEN)
apache2    1254      www-data    6u  IPv6 1421913525      0t0  TCP *:http-alt (LISTEN)
munin-nod  2163          root    5u  IPv6     236601      0t0  TCP *:munin (LISTEN)
apache2    3131          root    4u  IPv6 1421913521      0t0  TCP *:http (LISTEN)
apache2    3131          root    6u  IPv6 1421913525      0t0  TCP *:http-alt (LISTEN)
rpcbind    3355          root    8u  IPv4      12701      0t0  TCP *:sunrpc (LISTEN)
...

Список всех NFS-файлов можно получить так:

lsof -N
COMMAND     PID          USER   FD   TYPE     DEVICE SIZE/OFF NODE     NAME
nginx     10927      www-data  710r   REG       0,21     5328 20321383 /var/www/design/610704_company_logo_1.png (192.168.0.20:/srv/www)
nginx     10927      www-data  723r   REG       0,21    10754 20447333 /var/www/design/505720_company_logo_1.png (192.168.0.20:/srv/www)
nginx     10927      www-data  725r   REG       0,21     5025 20054887 /var/www/design/349575_company_logo_1.png (192.168.0.20:/srv/www)
nginx     10927      www-data  745r   REG       0,21    40864 20451592 /var/www/design/34748_page_job_footer_12.jpg (192.168.0.20:/srv/www)
tweet Share