Команда lsof
Команда lsof
означает Список Открытых Файлов (List Open Files). Эта терминальная команда предназначена для вывода информации о файлах, открытых различными процессами. В линуксе всё является файлами (потоки, сокеты, каталоги, устройства и т.д.). И с помощью команды lsоf
можно получить информацию о любых открытых файлах.
Введение в lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,2 4096 2 /
init 1 root txt REG 8,2 163096 2752544 /sbin/
init 1 root 0u CHR 1,3 0t0 1029 /dev/null
init 1 root 1u CHR 1,3 0t0 1029 /dev/null
init 1 root 5r 0000 0,9 0 6797 anon_inode
По-умолчанию выводится один файл на строку. Большинство колонок понятны без объяснения. Расскажем про колонки FD
и TYPE
. FD
— означает описание файла (File Descriptor). Некоторые из значений FD
:
cwd
— текущий рабочий каталог (Current Working Directory)txt
— текстовый файлmem
— отражённый в памяти файл (Memory Mapped File)mmap
— отражённое в памяти устройство (Memory Mapped Device)
ЧИСЛО
— представляет собой дескриптор файла. Символ после числа, напр. 0u
, означает режим в котором открыт файл. r
— по чтению, w
— по записи, u
— по чтению и записи.
TYPE
— определяет тип файла:
REG
— обычный файлDIR
— каталогFIFO
— первым пришёл первым ушёлCHR
— символьный специальный файл
Для полного списка значений FD
и TYPE
см. man lsof
.
Список процессов открывших определённый файл
lsof /var/log/syslog
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1022 syslog 1w REG 8,2 1446383 1316813 /var/log/syslog
Список открытых файлов в указанном каталоге
Вы можете вывести процессы открывшие файл в указанном каталоге с ключом +D
. По этому ключу рекурсивно выводятся все файлы. Без рекурсии: +d
.
lsof +D /var/log/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
smbd 998 root 2w REG 8,2 34332 1444090 /var/log/samba/log.smbd
smbd 1010 root 2w REG 8,2 34332 1444090 /var/log/samba/log.smbd
rsyslogd 1022 syslog 1w REG 8,2 1446383 1316813 /var/log/syslog
rsyslogd 1022 syslog 2w REG 8,2 1426077 1316945 /var/log/kern.log
Список файлов, открытых определённым процессом
Можно указывать неполное имя процесса используя ключ -c
. Можно указывать сразу несколько процессов.
sudo lsof -c ssh -c init
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root txt REG 8,2 163096 2752544 /sbin/init
sshd 1003 root 3r IPv4 9544 0t0 TCP *:ssh (LISTEN)
sshd 1003 root 4u IPv6 9546 0t0 TCP *:ssh (LISTEN)
Список файлов по точке монтирования
Иногда при попытке отмонтировать устройство, система не даёт этого сделать, т.к. какой-то файл на устройстве занят. С помощью lsof
можно узнать, каким процессом занято устройство, файл или каталог.
lsof /home
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1678 sergei cwd DIR 8,4 4096 22413313 /home/sergei
lsof 1834 sergei cwd DIR 8,4 4096 22413313 /home/sergei
То же самое:
lsof +D /home
Список файлов, открытых пользователем
lsof -u sergei
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
afpd 1209 sergei cwd unknown /proc/1209/cwd (readlink: Permission denied)
bash 1678 sergei txt REG 8,2 955024 1572944 /bin/bash
lsof 1836 sergei txt REG 8,2 131312 797978 /usr/bin/lsof
Для вывода фалов открытых всеми пользователями, кроме указанного, перед именем ставится ^
lsof -u ^sergei
Список файлов, открытых указанным процессом
sudo lsof -p 1677
[sudo] password for sergei:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1677 sergei cwd DIR 8,2 4096 2 /
sshd 1677 sergei rtd DIR 8,2 4096 2 /
sshd 1677 sergei txt REG 8,2 517112 798819 /usr/sbin/sshd
sshd 1677 sergei DEL REG 0,4 10386 /dev/zero
sshd 1677 sergei mem REG 8,2 39144 798897 /usr/lib/libcrack.so.2.8.1
Завершить все процессы, открытые указанным пользователем
Когда нужно завершить все процессы, открытые каким-то пользователем, задайте ключ -t
для вывода только id
процесса и передайте их команде kill
:
kill -9 'lsof -t -u sergei'
Ключ -t
можно использовать различными способами, например, получить список id
процесса, открывшего какой-то файл:
sudo lsof -t /var/log/syslog
1022
Список сетевых соединений
Сетевые соединения — это тоже файлы, смотрим их с ключом -i
lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1003 root 3r IPv4 9544 0t0 TCP *:ssh (LISTEN)
sshd 1003 root 4u IPv6 9546 0t0 TCP *:ssh (LISTEN)
nmbd 1011 root 9u IPv4 8016 0t0 UDP *:netbios-ns
nmbd 1011 root 10u IPv4 8017 0t0 UDP *:netbios-dgm
nmbd 1011 root 11u IPv4 8019 0t0 UDP stu.local:netbios-ns
Список сетевых файлов, открытых указанным процессом
По id
процесса:
sudo lsof -i -a -p 1003
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1003 root 3r IPv4 9544 0t0 TCP *:ssh (LISTEN)
sshd 1003 root 4u IPv6 9546 0t0 TCP *:ssh (LISTEN)
Или по названию процесса:
sudo lsof -i -a -c ssha
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1003 root 3r IPv4 9544 0t0 TCP *:ssh (LISTEN)
sshd 1003 root 4u IPv6 9546 0t0 TCP *:ssh (LISTEN)
sshd 1356 root 3r IPv4 11486 0t0 TCP stu.local:ssh->sergeiml.local:49598 (ESTABLISHED)
sshd 1677 sergei 3u IPv4 11486 0t0 TCP stu.local:ssh->sergeiml.local:49598 (ESTABLISHED)
Список всех TCP или UDP соединений
sudo lsof -i tcp; sudo lsof -i udp;
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
smbd 998 root 27u IPv4 9575 0t0 TCP *:microsoft-ds (LISTEN)
smbd 998 root 28u IPv4 9577 0t0 TCP *:netbios-ssn (LISTEN)
sshd 1003 root 3r IPv4 9544 0t0 TCP *:ssh (LISTEN)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nmbd 1011 root 9u IPv4 8016 0t0 UDP *:netbios-ns
nmbd 1011 root 10u IPv4 8017 0t0 UDP *:netbios-dgm
Список всех файлов, открытых через NFS
lsof -N -u sergei -a
Удачи! Не забываем man lsof
.
При перепечатке ссылка на unixone.ru обязательна.