Thank you for reading this post, don't forget to subscribe!
Имя утилиты LSOF
является аббревиатурой от List Of Opened Files
, и предназначена она, как следует из названия, для отображения открытых файлов различными процессами и/или пользователями.
Если утилиты в системе нет — установим её.
yum -y install lsof
Будучи запущенной без дополнительных опций — утилита выведет информацию обо всех запущенных процессах и всех открытых ими файлах. Опции рассмотрим ниже.
1 2 3 4 5 6 7 8 |
lsof | less COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 149284 38 /sbin/init init 1 root mem REG 253,0 284780 262198 /lib/libdbus-1.so.3.4.0 init 1 root mem REG 253,0 1902708 262110 /lib/libc-2.12.so |
Информация предоставляется в виде колонок, в которых отображается информация:
COMMAND
— имя процесса;
PID
— его Process ID;
USER
— имя пользователя, запустившего процесс;
FD
— номер файлового дескриптора, либо обозначение типа:
- cwd — текущий рабочий каталог;
- ltx — текст разделяемой библиотеки;
- mem — файл, загруженный в память (memory-mapped file), чаще всего – библиотека,
- mmap — memory-mapped device;
- pd — родительский каталог;
- rtd — корневой каталог;
- txt – текст программы (код и данные);
Номер файлового дескриптора дополняется символом, указывающим режим, в котором файл был открыт:
- r — файл открыт для чтения;
- w – файл открыт для записи;
- u — файл открыт для чтения и для записи;
- пробел – режим доступа неизвестен и файл не блокирован;
- ‘-’ — режим доступа неизвестен, но на файл установлена блокировка.
В последнем случае за дефисом следует еще один символ, определяющий тип блокировки.
TYPE
— тип открытого файла, обозначающиеся: REG
— обычный файл, DIR
— каталог, BLK
— файл блочного устройства, CHR
— файл символьного устройства, LINK
— файл символической ссылки, INET
– Internet-сокет, UNIX
– доменный сокет UNIX;
DEVICE
— устройство, на котором открыт данный файл;
SIZE/OFF
— размер файла в байтах;
NODE
— номер индексного дескриптора (inode);
NAME
— собственно, имя самого файла и путь к нему.
Примеры использования
Отобразить список процессов/пользователей, использующих в данный момент файл /usr/sbin/sshd
:
1 2 3 4 |
<strong>lsof /usr/sbin/sshd</strong> COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 886 root txt REG 253,2 815520 140115 /usr/sbin/sshd sshd 2010 root txt REG 253,2 815520 140115 /usr/sbin/sshd |
Можно указать несколько файлов и/или каталогов, разделив их пробелом:
lsof /usr/sbin/sshd /home/mid
Отобразить список процессов и пользователей, использующих каталог /home/mid
1 2 3 4 5 6 7 |
# lsof +d /home/mid/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1206 mid cwd DIR 253,0 4096 213 /home/mid su 1223 root cwd DIR 253,0 4096 213 /home/mid bash 1227 root cwd DIR 253,0 4096 213 /home/mid lsof 1253 root cwd DIR 253,0 4096 213 /home/mid lsof 1254 root cwd DIR 253,0 4096 213 /home/mid |
Что бы отобразить и все подкаталоги — используйте ключ +D
:
1 2 3 4 5 6 7 8 9 |
# lsof +D /home/mid/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME su 1223 root cwd DIR 253,0 4096 213 /home/mid bash 1227 root cwd DIR 253,0 4096 213 /home/mid screen 1258 root cwd DIR 253,0 4096 213 /home/mid bash 1260 root cwd DIR 253,0 4096 132 /home/mid/dir1 bash 1267 root cwd DIR 253,0 4096 132 /home/mid/dir1 lsof 1281 root cwd DIR 253,0 4096 213 /home/mid lsof 1282 root cwd DIR 253,0 4096 213 /home/mid |
Отобразить файлы, открытые процессом screen
:
1 2 3 4 5 6 |
# lsof -c screen COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME screen 1258 root cwd DIR 253,0 4096 213 /home/mid screen 1258 root rtd DIR 253,0 4096 2 / screen 1258 root txt REG 253,0 371220 658057 /usr/bin/screen screen 1258 root mem REG 253,0 38376 262114 /lib/libcrypt-2.12.so |
опция -c
учитывает заданное имя «по маске». Т.е. результат будет включать в себя процессы, в имени которых содержится строка «screen«.
Как и выводом информации о файлах, можно использовать несколько значений:
1 2 3 4 5 6 7 8 |
# lsof -c screen -c vi COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME screen 1258 root cwd DIR 253,0 4096 213 /home/mid screen 1258 root rtd DIR 253,0 4096 2 / ... vi 1286 root cwd DIR 253,0 4096 213 /home/mid vi 1286 root rtd DIR 253,0 4096 2 / vi 1286 root txt REG 253,0 715044 784795 /bin/vi |
Для более точного указания процесса — можно указать PID
процесса:
1 2 3 4 5 |
# lsof -p 1205 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 midcwd DIR 253,0 4096 2 / sshd 1205 midrtd DIR 253,0 4096 2 / sshd 1205 midtxt REG 253,0 524144 657883 /usr/sbin/sshd |
Можно задать несколько PID
, разделив их запятыми (без пробелов):
lsof -p 1205,1259
Наиболее полезная возможность — отобразить файлы, открытые определённым пользователем:
1 2 3 4 5 6 |
# lsof -u mid COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 mid cwd DIR 253,0 4096 2 / sshd 1205 mid rtd DIR 253,0 4096 2 / sshd 1205 mid txt REG 253,0 524144 657883 /usr/sbin/sshd sshd 1205 mid mem REG 253,0 120780 265084 /lib/libselinux.so.1 |
Что бы вывести всё, кроме пользователя mid — используйте комбинацию ^
:
1 |
# lsof -u ^mid |
Этот же способ исключения можно использовать и для всех других опций.
Тут так же можно использовать несколько имён и/или UID
-ов, разделённых запятой:
1 |
# lsof -u mid,0 |
Где 0 — это UID
пользователя root
.
Кроме того, lsof
может отобразить активные сетевые включения, аналогично утилите netstat
1 2 3 4 5 6 7 8 9 10 |
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dhclient 989 root 5u IPv4 10367 0t0 UDP *:bootpc sshd 1088 root 3u IPv4 10634 0t0 TCP *:ssh (LISTEN) sshd 1088 root 4u IPv6 10636 0t0 TCP *:ssh (LISTEN) master 1164 root 12u IPv4 10836 0t0 TCP localhost:smtp (LISTEN) master 1164 root 13u IPv6 10838 0t0 TCP localhost:smtp (LISTEN) sshd 1201 root 3r IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) sshd 1205 mid 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
В кололнке NAME
так же указывается состояние соединения — LISTEN
(готов к приёму соединения), ESTABLISHED
(установлено).
Можно задать более точные параметры для вывода информации в формате [46][protocol][@hostname|hostaddr][:service|port]
.
4
и/или 6
— версия протокола IP (IPV4/IPV6)
;
protocol
— либо TCP
, либо UDP
(либо ничего);
hostname
— имя хоста;
hostaddr
— числовой адрес;
service
— имя интересующего сервиса, например — smtp
, или список таких сервисов;
port
— номер порта или список таких номеров.
Например, отобразить сервисы, прослушивающие порт 22 и/или уже установленные соединения на этом порту:
1 2 3 4 5 6 |
# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1088 root 3u IPv4 10634 0t0 TCP *:ssh (LISTEN) sshd 1088 root 4u IPv6 10636 0t0 TCP *:ssh (LISTEN) sshd 1201 root 3r IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) sshd 1205 mid 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
Либо — по имени сервиса:
1 2 3 4 5 6 |
# lsof -i :ssh COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1088 root 3u IPv4 10634 0t0 TCP *:ssh (LISTEN) sshd 1088 root 4u IPv6 10636 0t0 TCP *:ssh (LISTEN) sshd 1201 root 3r IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) sshd 1205 mid 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
Отобразить активные подключения с адреса 192.168.1.100:
1 2 3 4 |
# lsof -i @192.168.1.100 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1201 root 3r IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) sshd 1205 mid 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
Либо — скомбинировать все эти ключи:
1 2 3 4 |
# lsof -i TCP@192.168.1.100:58132 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1201 root 3r IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) sshd 1205 mid 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
Можно отобразить, например, только те процессы и файлы, у которых в колонке FD
указан тип «mem
«:
1 |
# lsof -d mem |
Полезная опция -t
— вывести только PID
-ы процессов. Например — отобразить активные PID
пользователя mid:
1 2 3 |
# lsof -t -u mid 1205 1206 |
Эту комбинацию удобно использовать вместе с другими командами. Например — «убить» все сетевые процессы:
1 |
# kill -9 `lsof -t -i` |
Или — убить все сетевые процессы пользователя mid:
1 |
# kill -9 `lsof -t -u mid -i -a` |
Тут необходимо остановиться подробнее на опции -a
.
По-умолчанию, при использовании нескольких опций lsof
выведет информацию о всех попадающих под эти опции процессах, т.е. используется логическое ИЛИ.
Например:
1 2 3 4 5 6 7 |
# lsof -p 1205 -u mid COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 mid cwd DIR 253,0 4096 2 / sshd 1205 mid rtd DIR 253,0 4096 2 / ... bash 1206 mid cwd DIR 253,0 4096 213 /home/mid bash 1206 mid rtd DIR 253,0 4096 2 / |
В такой комбинации будет отображена информация о файлах, открытых процессом с PID 1205
, а так же — процессы пользователя mid.
Если же необходимо указать четкое значение «опция 1 И опция 2» — используется ключ -a
.
Например, вывести информацию о файле /usr/sbin/sshd
, который открыт пользователем mid:
1 2 3 |
# lsof -u mid -a /usr/sbin/sshd COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 mid txt REG 253,0 524144 657883 /usr/sbin/sshd |
Ещё одна полезгная опция утилиты lsof
— ключ -r
, который выполняет запрос циклически, через заданный в секундах промежуток времени.
Например — отобразить все активные сетевые соединения пользователя mid и обновлять информацию каждые 10 секунд (обратите внимание, что тут тоже используется ключ -a
для уточнения отображаемой информации:
1 2 3 4 5 6 7 8 9 10 |
# lsof -r 1 -u mid -i -a COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ...======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 mid 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 mid 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) ======= ... |