Использование утилиты lsof

Thank you for reading this post, don't forget to subscribe!

Имя ути­ли­ты LSOF явля­ет­ся аббре­ви­а­ту­рой от List Of Opened Files, и пред­на­зна­че­на она, как сле­ду­ет из назва­ния, для отоб­ра­же­ния откры­тых фай­лов раз­лич­ны­ми про­цес­са­ми и/или пользователями.

Если ути­ли­ты в систе­ме нет — уста­но­вим её.

yum -y install lsof

Будучи запу­щен­ной без допол­ни­тель­ных опций — ути­ли­та выве­дет инфор­ма­цию обо всех запу­щен­ных про­цес­сах и всех откры­тых ими фай­лах. Опции рас­смот­рим ниже.

Инфор­ма­ция предо­став­ля­ет­ся в виде коло­нок, в кото­рых отоб­ра­жа­ет­ся информация:

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:

Мож­но ука­зать несколь­ко фай­лов и/или ката­ло­гов, раз­де­лив их пробелом:
lsof /usr/sbin/sshd /home/mid

Отоб­ра­зить спи­сок про­цес­сов и поль­зо­ва­те­лей, исполь­зу­ю­щих ката­лог /home/mid

Что бы отоб­ра­зить и все под­ка­та­ло­ги — исполь­зуй­те ключ +D:

Отоб­ра­зить фай­лы, откры­тые про­цес­сом screen:

опция -c учи­ты­ва­ет задан­ное имя «по мас­ке». Т.е. резуль­тат будет вклю­чать в себя про­цес­сы, в име­ни кото­рых содер­жит­ся стро­ка «screen«.

Как и выво­дом инфор­ма­ции о фай­лах, мож­но исполь­зо­вать несколь­ко значений:

Для более точ­но­го ука­за­ния про­цес­са — мож­но ука­зать PID процесса:

Мож­но задать несколь­ко PID, раз­де­лив их запя­ты­ми (без пробелов):

lsof -p 1205,1259

Наи­бо­лее полез­ная воз­мож­ность — отоб­ра­зить фай­лы, откры­тые опре­де­лён­ным пользователем:

Что бы выве­сти всё, кро­ме поль­зо­ва­те­ля mid — исполь­зуй­те ком­би­на­цию ^:

Этот же спо­соб исклю­че­ния мож­но исполь­зо­вать и для всех дру­гих опций.

Тут так же мож­но исполь­зо­вать несколь­ко имён и/или UID-ов, раз­де­лён­ных запятой:

Где 0 — это UID поль­зо­ва­те­ля root.

Кро­ме того, lsof может отоб­ра­зить актив­ные сете­вые вклю­че­ния, ана­ло­гич­но ути­ли­те netstat

В кололн­ке NAME так же ука­зы­ва­ет­ся состо­я­ние соеди­не­ния — LISTEN (готов к при­ё­му соеди­не­ния), ESTABLISHED (уста­нов­ле­но).

Мож­но задать более точ­ные пара­мет­ры для выво­да инфор­ма­ции в фор­ма­те [46][protocol][@hostname|hostaddr][:service|port].

4 и/или 6 — вер­сия про­то­ко­ла IP (IPV4/IPV6);
protocol — либо TCP, либо UDP (либо ничего);
hostname — имя хоста;
hostaddr — чис­ло­вой адрес;
service — имя инте­ре­су­ю­ще­го сер­ви­са, напри­мер — smtp, или спи­сок таких сервисов;
port — номер пор­та или спи­сок таких номеров.

Напри­мер, отоб­ра­зить сер­ви­сы, про­слу­ши­ва­ю­щие порт 22 и/или уже уста­нов­лен­ные соеди­не­ния на этом порту:

Либо — по име­ни сервиса:

Отоб­ра­зить актив­ные под­клю­че­ния с адре­са 192.168.1.100:

Либо — ском­би­ни­ро­вать все эти ключи:

Мож­но отоб­ра­зить, напри­мер, толь­ко те про­цес­сы и фай­лы, у кото­рых в колон­ке FD ука­зан тип «mem«:

Полез­ная опция -t — выве­сти толь­ко PID-ы про­цес­сов. Напри­мер — отоб­ра­зить актив­ные PID поль­зо­ва­те­ля mid:

Эту ком­би­на­цию удоб­но исполь­зо­вать вме­сте с дру­ги­ми коман­да­ми. Напри­мер — «убить» все сете­вые процессы:

Или — убить все сете­вые про­цес­сы поль­зо­ва­те­ля mid:

Тут необ­хо­ди­мо оста­но­вить­ся подроб­нее на опции -a.

По-умол­ча­нию, при исполь­зо­ва­нии несколь­ких опций lsof выве­дет инфор­ма­цию о всех попа­да­ю­щих под эти опции про­цес­сах, т.е. исполь­зу­ет­ся логи­че­ское ИЛИ.

Напри­мер:

В такой ком­би­на­ции будет отоб­ра­же­на инфор­ма­ция о фай­лах, откры­тых про­цес­сом с PID 1205, а так же — про­цес­сы поль­зо­ва­те­ля mid.

Если же необ­хо­ди­мо ука­зать чет­кое зна­че­ние «опция 1 И опция 2» — исполь­зу­ет­ся ключ -a.

Напри­мер, выве­сти инфор­ма­цию о фай­ле /usr/sbin/sshd, кото­рый открыт поль­зо­ва­те­лем mid:

Ещё одна полез­г­ная опция ути­ли­ты lsof — ключ -r, кото­рый выпол­ня­ет запрос цик­ли­че­ски, через задан­ный в секун­дах про­ме­жу­ток времени.

Напри­мер — отоб­ра­зить все актив­ные сете­вые соеди­не­ния поль­зо­ва­те­ля mid и обнов­лять инфор­ма­цию каж­дые 10 секунд (обра­ти­те вни­ма­ние, что тут тоже исполь­зу­ет­ся ключ -a для уточ­не­ния отоб­ра­жа­е­мой информации: