Практические примеры использования lsof
Sep 22, 2016 22:35 · 1207 words · 6 minute read
Утилита командной строки 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)