Использование утилиты lsof в примерах
Имя утилиты LSOF является аббревиатурой от List Of Opened Files, и предназначена она, как следует из названия, для отображения открытых файлов различными процессами и/или пользователями.
Если утилиты в системе нет — установим её.
Будучи запущенной без дополнительных опций — утилита выведет информацию обо всех запущенных процессах и всех открытых ими файлах. Опции рассмотрим ниже.
1 2 3 4 5 6 7 |
<pre class="decode:1 " ># 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 — собственно, имя самого файла и путь к нему.
Приведённое описание сравнительно краткое, больше информации можно найти в man lsof.
Примеры использования
Отобразить список процессов/пользователей, использующих в данный момент файл /usr/sbin/sshd:
1 2 3 4 5 |
<pre class="decode:1 " ># lsof /usr/sbin/sshd COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1088 root txt REG 253,0 524144 657883 /usr/sbin/sshd sshd 1201 root txt REG 253,0 524144 657883 /usr/sbin/sshd sshd 1205 setevoy txt REG 253,0 524144 657883 /usr/sbin/sshd |
Можно указать несколько файлов и/или каталогов, разделив их пробелом:
1 2 3 4 |
<pre class="decode:1 " ># lsof /usr/sbin/sshd /home/user COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1088 root txt REG 253,0 524144 657883 /usr/sbin/sshd bash 1206 user cwd DIR 253,0 4096 213 /home/user |
Отобразить список процессов и пользователей, использующих каталог /home/user/:
1 2 3 4 5 6 7 |
<pre class="decode:1 " ># lsof +d /home/user/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1206 user cwd DIR 253,0 4096 213 /home/user su 1223 root cwd DIR 253,0 4096 213 /home/user bash 1227 root cwd DIR 253,0 4096 213 /home/user lsof 1253 root cwd DIR 253,0 4096 213 /home/user lsof 1254 root cwd DIR 253,0 4096 213 /home/user |
Что бы отобразить и все подкаталоги — используйте ключ +D:
1 2 3 4 5 6 7 8 9 |
<pre class="decode:1 " ># lsof +D /home/user/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME su 1223 root cwd DIR 253,0 4096 213 /home/user bash 1227 root cwd DIR 253,0 4096 213 /home/user screen 1258 root cwd DIR 253,0 4096 213 /home/user bash 1260 root cwd DIR 253,0 4096 132 /home/user/dir1 bash 1267 root cwd DIR 253,0 4096 132 /home/user/dir1 lsof 1281 root cwd DIR 253,0 4096 213 /home/user lsof 1282 root cwd DIR 253,0 4096 213 /home/user |
Отобразить файлы, открытые процессом screen:
1 2 3 4 5 6 |
<pre class="decode:1 " ># lsof -c screen COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME screen 1258 root cwd DIR 253,0 4096 213 /home/user 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 |
<pre class="decode:1 " ># 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/user screen 1258 root rtd DIR 253,0 4096 2 / ... vi 1286 root cwd DIR 253,0 4096 213 /home/user 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 |
<pre class="decode:1 " ># lsof -p 1205 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 user cwd DIR 253,0 4096 2 / sshd 1205 user rtd DIR 253,0 4096 2 / sshd 1205 user txt REG 253,0 524144 657883 /usr/sbin/sshd |
Можно задать несколько PID, разделив их запятыми (без пробелов):
1 |
<pre class="decode:1 " ># lsof -p 1205,1259 |
Наиболее полезная возможность — отобразить файлы, открытые пользователем user:
1 2 3 4 5 6 |
<pre class="decode:1 " ># lsof -u user COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 user cwd DIR 253,0 4096 2 / sshd 1205 user rtd DIR 253,0 4096 2 / sshd 1205 user txt REG 253,0 524144 657883 /usr/sbin/sshd sshd 1205 user mem REG 253,0 120780 265084 /lib/libselinux.so.1 |
Что бы вывести всё, кроме пользователя user — используйте комбинацию ^:
1 |
<pre class="decode:1 " ># lsof -u ^user |
Этот же способ исключения можно использовать и для всех других опций.
Тут так же можно использовать несколько имён и/или UID-ов, разделённых запятой:
1 |
<pre class="decode:1 " ># lsof -u user,0 |
Где 0 — это UID пользователя root.
Кроме того, lsof может отобразить активные сетевые включения, аналогично утилите netstat, для этого выполняем:
1 2 3 4 5 6 7 8 9 |
<pre class="decode:1 " ># 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 user 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 |
<pre class="decode:1 " ># 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 user 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
Либо — по имени сервиса:
1 2 3 4 5 6 |
<pre class="decode:1 " ># 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 user 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
Отобразить активные подключения с адреса 192.168.1.100:
1 2 3 4 |
<pre class="decode:1 " ># 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 user 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
Либо — скомбинировать все эти ключи:
1 2 3 4 |
<pre class="decode:1 " ># 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 user 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) |
Можно отобразить, например, только те процессы и файлы, у которых в колонке FD указан тип «mem«:
1 |
<pre class="decode:1 " ># lsof -d mem |
Полезная опция -t — вывести только PID-ы процессов. Например — отобразить активные PID пользователя user:
1 2 3 |
<pre class="decode:1 " ># lsof -t -u user 1205 1206 |
Эту комбинацию удобно использовать вместе с другими командами. Например — «убить» все сетевые процессы:
1 |
<pre class="decode:1 " ># kill -9 `lsof -t -i` |
Или — убить все сетевые процессы пользователя user:
1 |
<pre class="decode:1 " ># kill -9 `lsof -t -u user -i -a` |
Тут необходимо остановиться подробнее на опции -a.
По-умолчанию, при использовании нескольких опций lsof выведет информацию о всех попадающих под эти опции процессах, т.е. используется логическое ИЛИ.
Например:
1 2 3 4 5 6 7 |
<pre class="decode:1 " ># lsof -p 1205 -u user COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 user cwd DIR 253,0 4096 2 / sshd 1205 user rtd DIR 253,0 4096 2 / ... bash 1206 user cwd DIR 253,0 4096 213 /home/setevoy bash 1206 user rtd DIR 253,0 4096 2 / |
В такой комбинации будет отображена информация о файлах, открытых процессом с PID 1205, а так же — процессы пользователя user.
Если же необходимо указать четкое значение «опция 1 И опция 2» — используется ключ -a.
Например, вывести информацию о файле /usr/sbin/sshd, который открыт пользователем user:
1 2 3 |
<pre class="decode:1 " ># lsof -u user -a /usr/sbin/sshd COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 user txt REG 253,0 524144 657883 /usr/sbin/sshd |
Ещё одна полезная опция утилиты lsof — ключ -r, который выполняет запрос циклически, через заданный в секундах промежуток времени.
Например — отобразить все активные сетевые соединения пользователя user и обновлять информацию каждые 10 секунд (обратите внимание, что тут тоже используется ключ -a для уточнения отображаемой информации:
1 2 3 4 5 6 7 8 9 10 |
<pre class="decode:1 " ># lsof -r 1 -u user -i -a COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ...======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1205 user 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 user 3u IPv4 11268 0t0 TCP 192.168.1.108:ssh->192.168.1.100:58132 (ESTABLISHED) ======= ... |