Показать страницуИстория страницыСсылки сюдаНаверх Эта страница только для чтения. Вы можете посмотреть её исходный текст, но не можете его изменить. Сообщите администратору, если считаете, что это неправильно. ======lsof====== =====Install===== <code bash>sudo apt install lsof</code> =====Options===== * <html>-u</html> -- выводит список файлов, открытых конкретным пользователем, * <html>-U</html> -- позволяет вывести все файлы сокетов домена Unix, * <html>-c</html> -- позволяет вывести сведения о файлах, которые держат открытыми процессы, выполняющие команды, имена которых начинаются с заданных символов. * <html>+d</html> -- позволяет выяснить, какие папки и файлы открыты в некоей директории (но не в её поддиректориях), * <html>-d</html> -- опция позволяет задать список дескрипторов файлов, разделённых запятой, которые надо включить в вывод или исключить из него, * <html>-p</html> -- позволяет вывести все файлы, открытые процессом с указанным при вызове команды PID, * <html>-P</html> -- подавляет, для сетевых файлов, преобразование номеров портов в имена портов. Её полезно использовать в тех случаях, когда разрешение имён портов работает неправильно. * <html>-i</html> -- позволяет вывести сведения о файлах, интернет-адреса которых соответствуют заданному адресу. Если при вызове команды не задавать адреса, эта опция позволяет вывести сведения обо всех интернет-сокетах и сетевых файлах. * <html>-t</html> -- подавляет вывод всей информации за исключением ID процессов. Её часто используют, если нужно перенаправить список PID какой-нибудь другой команде, в основном -- <html>kill-9</html> =====SYNOPSIS===== <code bash>lsof [ -?abChKlnNOPRtUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [+|-D D ] [ +|-e s ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g [s] ] [ -i [i] ] [-k k ] [ +|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r[t[m<fmt>]] ] [ -s [p:s] ] [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x[fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]</code> Если просто запустить lsof, получим вывод, где можно увидеть заголовок, такой как команда, Pid, User, FD и т. д. Большинство столбцов и их значений говорят сами за себя. ИЗа исключением FD. FD относится к файловому дескриптору и содержит такие значения, как:\\ **FD** * <html>cwd</html> -- текущий рабочий каталог; * <html>mem</html> -- файл, загруженный в память, чаще всего — библиотека; * <html>mxx</html> — hex memory-mapped type; * <html>mmap</html> -- memory-mapped device; * <html>pd</html> -- родительский каталог; * <html>rtd</html> -- корневой каталог; * <html>тхт</html> -- текст программы (код и данные); Кроме того, в столбцах **FD** такие номера (такие, как 1u), которые, фактическим являются дескриптором файла, а за ним следует один из флагов u, r, w как режим доступа: * <html>r</html> -- доступа для чтения; * <html>w</html> -- доступа для записи; * <html>u</html> -- чтения и записи; * <html>пробел</html> -- режим доступа неизвестен и файл не блокирован; * <html>-</html> -- режим доступа неизвестен, но на файл установлена блокировка. **TYPE** -- файлов и их идентификация: * <html>DIR</html> -- директория; * <html>REG</html> -- обычный файл; * <html>CHR</html> -- файл символьного устройства; * <html>FIFO</html> -- First In First Out; * <html>LINK</html> -- Симлинк; * <html>INET</html> -- Internet-сокет; * <html>UNIX</html> -- доменный сокет UNIX. =====Examples===== Следующий пример показывает, как можно узнать, сколько файлов держит открытыми пользователь nevvad: <code bash>lsof -u nevvad | wc -l 179 </code> Обычно, если перед параметром некоей опции ставят знак <html>^</html> (caret), который означает отрицание, это приводит к исключению файлов, соответствующих данному параметру, из вывода программы. Вот, например, как можно узнать количество файлов на компьютере, которые открыты всеми пользователями за исключением nevvad. <code bash>lsof -u^nevvad | wc -l 3949 </code> Вот какая команда позволит увидеть первые 15 файлов, открытых всеми процессами mariadbd, выполняющимися на компьютере <code bash>lsof -cmariadbd | head -15</code> Смотрим, какие каталоги и файлы открыты в некоей директории (но не в её поддиректориях). <code bash>lsof +d /usr/bin/ | head -5 </code> К примеру выше, можно привести пример из жизни, пытаемся отмонтировать например CD-ROM, но получаем ошибку -- Device is busy. Это означает, что какой-то процесс открыл файл, расположенный на этом устройстве. Смотрим: <code bash>lsof +d /mnt/cdrom COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mc 1547 rok cwd DIR 11,0 2048 53248 /mnt/cdrom bash 1556 rok cwd DIR 11,0 2048 53248 /mnt/cdrom</code> Как видим, сразу становится ясно, что дисковод используется пользователем rok, причем, видимо, какой-то подкаталог каталога <html>/mnt/cdrom</html> открыт в одной из панелей файлового менеджера Mifnight Commander (mc).\\ Вывод информации обо всех файлах, открытых процессом, скажем, с PID 1 в Ubuntu 22.04 <code bash> lsof -p 1 | head -10 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 4096 2 / systemd 1 root rtd DIR 253,0 4096 2 / systemd 1 root txt REG 253,0 1849992 13989 /usr/lib/systemd/systemd systemd 1 root mem REG 253,0 149760 1447 /usr/lib/x86_64-linux-gnu/libgpg-error.so.0.32.1 systemd 1 root mem REG 253,0 4447536 936 /usr/lib/x86_64-linux-gnu/libcrypto.so.3 systemd 1 root mem REG 253,0 27072 746 /usr/lib/x86_64-linux-gnu/libcap-ng.so.0.0.0 systemd 1 root mem REG 253,0 613064 1434 /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.10.4 systemd 1 root mem REG 253,0 170456 10218 /usr/lib/x86_64-linux-gnu/liblzma.so.5.2.5 systemd 1 root mem REG 253,0 841808 8018 /usr/lib/x86_64-linux-gnu/libzstd.so.1.4.8 </code> Смотрим на TCP-соединения, открытые клиентом Dropbox. <code bash>lsof -i -a -u $USER | grep dropbox</code> Находим процессы, которые прослушивают определенный диапазон портов <code bash>lsof -i TCP:1-100</code> Завершаем указанные процессы: <code bash>kill -9 $(lsof -t -i:8080)</code> Либо сохраняем PID процессов в лог, для дальнейшей экзекуции: <code bash>lsof -t /var/log/dummy_svc.log</code> Поищем, куда пишется определенный процесс, пусть это будут логи [[squid|squid]]: <code bash>lsof | grep squid | grep log squid 18671 squid 5u REG 253,0 3073 784030 /var/log/squid/cache.log squid 18671 squid 8w REG 253,0 4041 784031 /var/log/squid/store.log</code> \\ Так же очень полезной является опция <html>+L1</html>. <html>+L1</html> показывает файлы, которые были удалены, но все ещё используются какой-то программой, чаще всего логирование. Если сталкиваетесь с ситуацией, что место постоянно заканчивается, а найти файлы, которые его заполняют не получается, тогда просто нужно будет убить процесс, который использует этот файл и место сразу же освободится: <code bash> lsof -a +L1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME mariadbd 3037 mysql 6u REG 253,0 0 0 17110 /tmp/#17110 (deleted) mariadbd 3037 mysql 7u REG 253,0 0 0 17111 /tmp/#17111 (deleted) mariadbd 3037 mysql 8u REG 253,0 0 0 17309 /tmp/#17309 (deleted) mariadbd 3037 mysql 11u REG 253,0 0 0 17310 /tmp/#17310 (deleted) # Ну или так lsof | grep deleted </code> =====Комбинирование опций===== Обычно lsof объединяет результаты использования нескольких опций, следуя принципу логического ИЛИ. Если задать опцию <html>-a</html>, результаты будут объединены по правилам логического И.\\ Конечно, есть несколько исключений из этого правила, тут, как обычно, рекомендовано взглянуть на документацию, но если в двух словах, то работает это так:\\ Обычно заданные опции списка объединяются по принципу логического ИЛИ, то есть, если указать опцию <html>-i</html> без указания адреса, и опцию <html>-u foo</html>, будет выведен список всех сетевых файлов или файлов, принадлежащих процессам, владельцем которых является пользователь «foo». Из этого правила есть несколько исключений: - Имя пользователя или ID пользователя (UID) со знаком <html>^</html> (отрицание), заданное с опцией <html>-u</html>; - Идентификатор процесса (PID) со знаком <html>^</html> (отрицание), заданный с опцией <html>-p</html>; - Группа процессов (PGID) со знаком <html>^</html> (отрицание), заданная с опцией <html>-g</html>; - Имя команды со знаком <html>^</html> (отрицание), заданное с опцией <html>-c</html>; - Имена состояний протоколов TCP или UDP, заданные с опцией <html>-s [p:s]</html>. К примеру: <code bash>lsof -a -U -u nevvad</code> Выдаст список только сокетов UNIX, принадлежащих процессам, владельцем которых является пользователь nevvad. Обратите внимание на то, что опция <html>-a</html> стоит не между объединяемыми ею другими опциями. Впрочем, ее можно ставить где угодно, все равно все перечисленные в командной строке опции будут работать по принципу "логическое И". lsof.txt Последнее изменение: 2022/04/26 13:42 — admin