U1 Слово Лѣтопись Имперія Вѣда NX ТЕ  

NX

       

Команда lsof


16 янв 2015 


Команда 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 обязательна.