panelarrow

Сайт обо всём по-немногу

Сайт обо всём по-немногу

Работа с утилитой lsof

| 0 comments

Очень часто, при работе с какой-либо из операционных систем UNIX, возникает необходимость узнать, кто работает с тем или иным файлом. В UNIX любое устройство или данные представляются в виде файла. Файлы могут быть разных видов — символьные, блочные, каталоги и собственно файлы с данными. Поэтому, работающая система обычно имеет большое количество открытых файлов. Если возникает необходимо узнать, кто и зачем открыл файл, процесс или пользователь, то на этот случай в UNIX имеется утилита lsof (list open files), исходные тексты которой доступны по следующей ссылке. С помощью данной утилиты можно узнать, какие файлы открыты процессом если известен его PID, какие процессы открыли файл, если известно его имя, и много другое. Например, чтобы узнать кто запустил на выполнение команду mc, необходимо выполнить команду:

# lsof /usr/bin/mc
COMMAND   PID USER  FD   TYPE DEVICE   SIZE      NODE NAME
mc      30593 root txt    REG   0,47 607316 188702040 /usr/bin/mc

чтобы получить PID процесса открывшего файл /usr/bin/mc, нужно выполнить:

# lsof -t /usr/bin/mc
30593

чтобы поглядеть файлы, открытые определённым пользователем, необходимо выполнить:

# lsof -u apache
COMMAND   PID   USER   FD   TYPE    DEVICE     SIZE      NODE NAME
httpd    7859 apache  cwd    DIR      0,47     4096 181995782 /
httpd    7859 apache  rtd    DIR      0,47     4096 181995782 /

для того, чтобы увидеть файлы открытые каким-либо процессом, следует выполнить:

# lsof -p 30593
COMMAND   PID USER   FD   TYPE DEVICE     SIZE      NODE NAME
mc      30593 root  cwd    DIR   0,47    36864 188679876 /usr/bin
mc      30593 root  rtd    DIR   0,47     4096 181995782 /
mc      30593 root  txt    REG   0,47   607316 188702040 /usr/bin/mc

Так как сокеты в системе представляются в виде файлов, точнее работа ведётся с ними через дескрипторы, то поэтому, через lsof можно получить список открытых сокетов и соединений, с помощью следующей команды:

# lsof -i
COMMAND     PID    USER   FD   TYPE    DEVICE SIZE NODE NAME
httpd      7859  apache    3u  IPv4 128438251       TCP *:http (LISTEN)
httpd      7879  apache    3u  IPv4 128438251       TCP *:http (LISTEN)
httpd      7880  apache    3u  IPv4 128438251       TCP *:http (LISTEN)

можно ограничить вывод информации только по определенному порту:

# lsof -i:22
COMMAND   PID USER   FD   TYPE   DEVICE SIZE NODE NAME
sshd    28438 root    3u  IPv4 85888179       TCP *:ssh (LISTEN)

При использования ключа -i lsof может работать довольно долго. Связано это с тем, что при работе она пытается отрезолвить IP-адреса и номера портов. Чтобы ускорить работу lsof, следует дополнительно указать ключ -n, который запрещает резолвить IP-адреса и номера портов.

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

lsof –N

Также, при запуске утилиты lsof можно указывать дополнительные условия которые будут применяться через логическое «И» или «НЕ», «ИЛИ» к запрашиваемым данным. По умолчанию к указанным аргументам применяется логическое «ИЛИ» при генерации вывода. Если указать опцию -a, то в этом случае, при генерации вывода будет применяться логическое «И», причём ко всем указанным аргументам. Например:

# lsof -u ^root -a /var
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
qmail-sen 34220 qmails  cwd   VDIR   0,91      512      5 /var/qmail/queue
qmail-cle 34223 qmailq  cwd   VDIR   0,91      512      5 /var/qmail/queue
qmail-tod 34224 qmails  cwd   VDIR   0,91      512      5 /var/qmail/queue
qmail-cle 34225 qmailq  cwd   VDIR   0,91      512      5 /var/qmail/queue

эта команда покажет открытые файлы не пользователем root и на разделе /var.

Более подробную информацию по использованию lsof можно получить из man'а, а также из FAQ'а команде.

Leave a comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *