- Linux какие файлы открыты процессом
- Для чего служит команда lsof
- Опции команды
- Применение команды lsof
- Пример 1. Кто работает с файлом или каталогом?
- Пример 2. Какой процесс использует данный файл?
- Учебное пособие по команде Linux lsof для начинающих (15 примеров)
- О команде lsof
- Установить линукс командой lsof
- 1. Как вывести список всех открытых файлов
- 2. Как составить список файлов, открытых процессами, принадлежащими конкретному пользователю
- 3. Как составить список файлов на основе их интернет-адреса
- 4. Как вывести список всех файлов по имени приложения
- 5. Как составить список файлов, специфичных для процесса
- 6. Как составить список идентификаторов процессов, открывших определенный файл
- 7. Как вывести список всех открытых файлов в каталоге
- 8. Как составить список всех файлов Интернета и сетевых файлов x.25 (HP-UX)
- 9. Узнайте, какая программа использует порт
- 10. Как вывести список открытых файлов на основе диапазона портов
- 11. Как составить список открытых файлов в зависимости от типа соединения (TCP или UDP)
- 12. Как сделать lsof список родительских PID процессов
- 13. Как найти сетевую активность пользователя
- 14. Список всех отображаемых в память файлов
- 15. Список всех файлов NFS
- Заключение
Linux какие файлы открыты процессом
Библиотека сайта rus-linux.net
fstat . Я, конечно, попытался вызвать эту команду в своей системе на основе дистрибутива ASP Linux 7.3, но такой команды в моей системе не обнаружилось. Команда man fstat сообщила, что есть такой системный вызов fstat , который выдает информацию об указанном файле, но писать собственную утилиту на основе этого системного вызова мне, прямо признаюсь, не по силам.
Сейчас я даже уже и не вспомню, откуда я это знал, но где-то в глубинах подсознания мелькнула мысль, что для решения этой проблемы можно использовать утилиту lsof . Кстати, один из читателей моей книги [3] в своем отзыве на книгу в качестве недостатка указал на то, что эта утилита в книге не описана. Я и решил попытаться применить lsof для решения своей задачи, и начал, естественно, с изучения справки, выдаваемой командой man lsof . А кроме того, поискал информацию в Интернет и нашел статьи 7. Все эти материалы и послужили основой для настоящей статьи.
Для чего служит команда lsof
Относительно lsof справка man как раз сообщает, что lsof есть сокращение от LiSt of Open Files, и что утилита эта служит для вывода информации о том, какие файлы используются теми или иными процессами. Причем утилита эта имеется в очень многих версиях и диалектах UNIX, включая Linux версии 2.1.72 и выше, а также в HP-UX, AIX, NextStep, Apple Darwin для Power Macintosh, SCO UnixWare, Solaris, FreeBSD, NetBDS, OpenBSD и так далее.
Создателем программа lsof является Victor A. Abell, его домашняя страничка расположена по адресу http://people.freebsd.org/~abe/ , где вы можете найти исходные коды программы. Их можно также скачать с FTP-сайта ftp://vic.cc.purdue.edu/pub/tools/unix/lsof. О том, как скомпилировать и установить программу, вы можете прочитать в статье [8].
Если запустить эту утилиту без параметров, выдается информация о всех работающих процессах и открытых ими файлах. Даже в моей системе с одним пользователем эта команда выдала 2344 строки текста. Попробуй проанализируй эту массу информации! Но давайте взглянем хотя бы на несколько строк ее вывода, чтобы на этом примере понять, какую же информацию она выдает.
Кстати, если вы будете экспериментировать, имейте в виду, что будучи запущенной простым пользователем, эта команда выдает информацию только о процессах, запущенных этим пользователем. Поэтому во многих случаях вы можете не получить от нее никакого ответа. Если вы хотите получить вразумительный ответ на любой свой запрос, ее необходимо запускать от имени root-а (можно воспользоваться следующей формой запуска sudo lsof ). Кроме того, команда отрабатывает достаточно медленно, так что будьте терпеливы и не щелкайте раньше времени + — программа не зависла, просто идет поиск информации.
А теперь смотрим листинг 1 (или результат работы программы на вашем экране).
Листинг 1. Вывод команды lsof.
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 3,3 4096 2 / init 1 root txt REG 3,3 27036 161176 /sbin/init init 1 root mem REG 3,3 103044 160493 /lib/ld-2.3.2.so init 1 root 10u FIFO 3,3 71954 /dev/initctl portmap 1528 rpc 3u IPv4 1656 UDP *:sunrpc xinetd 1649 root 0r CHR 1,3 65970 /dev/null rpc.mount 1682 root 5u unix 0xc34cea80 10311 socket nmbd 1790 root 6u IPv4 2456 UDP *:netbios-ns sh 23252 kos 4u CHR 5,0 70758 /dev/tty sh 23252 kos 6u CHR 136,3 5 /dev/pts/3 sh 23252 kos 8w FIFO 0,5 840800 pipe sh 23253 kos cwd DIR 3,3 4096 160487 /usr/share/man sh 23253 kos rtd DIR 3,3 4096 2 / sh 23253 kos txt REG 3,3 626028 160664 /bin/bash
Как видите, один и тот же процесс открывает много файлов, каждому из которых соответствует строка в выводе lsof . В начале строки указывается имя процесса, его идентификатор, имя пользователя, запустившего процесс. В столбце FD стоит номер файлового дескриптора или одна из следующих буквенных комбинаций (я не берусь корректно перевести на русский язык некоторых из расшифровок этих сокращений, так что привожу их в том виде, как они выдаются справочной системой):
- cwd — текущий рабочий каталог;
- ltx — текст разделяемой библиотеки;
- mxx — hex memory-mapped type number xx.
- m86 — DOS Merge mapped file;
- mem — файл, загруженный в память (memory-mapped file), чаще всего – библиотека,
- mmap — memory-mapped device;
- pd — родительский каталог;
- rtd — корневой каталог;
- txt – текст программы (код и данные);
- v86 — VP/ix mapped file.
- r — файл открыт для чтения;
- w – файл открыт для записи;
- u — файл открыт для чтения и для записи;
- пробел – режим доступа неизвестен и файл не блокирован;
- ‘-’ — режим доступа неизвестен, но на файл установлена блокировка.
Опции команды
Применение команды lsof
Не имеет смысла повторять в статье описание всех опций этой команды, имеющееся на страничке man. Давайте ограничимся тем, что рассмотрим ее применение и использование наиболее употребительных опций на примерах конкретных ситуаций.
Пример 1. Кто работает с файлом или каталогом?
[user]$ /usr/sbin/lsof +d /mnt/cdrom
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mc 1547 kos cwd DIR 11,0 2048 53248 /mnt/cdrom bash 1556 kos cwd DIR 11,0 2048 53248 /mnt/cdrom
Пример 2. Какой процесс использует данный файл?
[root]# /usr/sbin/lsof /etc/passwd
Учебное пособие по команде Linux lsof для начинающих (15 примеров)
Команда Linux lsof показывает в своих выходных данных информацию о файлах, открытых процессом. В этой статье мы обсудим инструмент Linux lsof на 15 простых для понимания примерах. Обратите внимание, что все примеры, упомянутые в этом руководстве, были протестированы на Ubuntu 22.04 LTS, но они будут работать и в других дистрибутивах Linux, таких как Debian, Fedora и CentOS.
О команде lsof
Если вы хотите быстро увидеть имена файлов, которые были открыты определенным процессом (или всеми процессами), команда lsof позволит вам сделать это. Открытый файл может быть обычным файлом или каталогом, библиотекой, специальным файлом или блочным устройством, символьным специальным файлом, исполняемой текстовой ссылкой или даже потоком или сетевым файлом. Вы также можете перечислить процессы по номеру порта. Если вы не вошли в систему как пользователь root, возможно, вам придется добавить sudo к командам.
Установить линукс командой lsof
Большинство дистрибутивов Linux поставляются с предустановленным lsof. Если он еще не установлен в вашей системе, используйте следующие команды для установки lsof:
1. Как вывести список всех открытых файлов
Чтобы вывести список всех открытых файлов, запустите команду lsof без каких-либо аргументов:
Например, вот снимок экрана части вывода, полученного вышеприведенной командой в моей системе:
Первый столбец представляет процесс, а последний столбец содержит имя файла. Для получения подробной информации обо всех столбцах перейдите на справочную страницу команд.
2. Как составить список файлов, открытых процессами, принадлежащими конкретному пользователю
Инструмент также позволяет вам перечислять файлы, открытые процессами, принадлежащими определенному пользователю. Доступ к этой функции можно получить с помощью параметра командной строки -u.
3. Как составить список файлов на основе их интернет-адреса
Инструмент позволяет составлять список файлов на основе их интернет-адреса. Это можно сделать с помощью параметра командной строки -i. Например, если вы хотите, вы можете отображать файлы IPv4 и IPv6 отдельно. Для IPv4 выполните следующую команду:
Аналогично, для IPv6 выполните следующую команду:
4. Как вывести список всех файлов по имени приложения
Параметр командной строки -c позволяет получить все файлы, открытые по имени программы.
Вам не обязательно использовать полное имя программы, так как показаны все программы, начинающиеся со слова apache. Так что в нашем случае в нем будут перечислены все процессы приложения apache2.
Опция -c — это просто ярлык для двух команд:
5. Как составить список файлов, специфичных для процесса
Инструмент также позволяет отображать открытые файлы на основе идентификационных номеров процессов (PID). Это можно сделать с помощью параметра командной строки -p.
Двигаясь дальше, вы также можете исключить определенные PID из вывода, добавив перед ними символ ^. Чтобы исключить определенный PID, вы можете запустить следующую команду:
Как видно на скриншоте выше, процесс с id 1 исключен из списка.
6. Как составить список идентификаторов процессов, открывших определенный файл
Инструмент позволяет вам перечислить идентификаторы процессов, которые открыли определенный файл. Это можно сделать с помощью параметра командной строки -t.
$ lsof -t /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.9.0
7. Как вывести список всех открытых файлов в каталоге
При желании вы также можете выполнить lsof поиск всех открытых экземпляров каталога (включая все содержащиеся в нем файлы и каталоги). Доступ к этой функции можно получить с помощью параметра командной строки +D.
8. Как составить список всех файлов Интернета и сетевых файлов x.25 (HP-UX)
Это возможно с помощью параметра командной строки -i, который мы описали ранее. Просто вы должны использовать его без каких-либо аргументов.
9. Узнайте, какая программа использует порт
Переключатель -i команды позволяет вам найти процесс или приложение, которое прослушивает определенный номер порта. В приведенном ниже примере я проверил, какая программа использует порт 80.
Вместо номера порта вы можете использовать имя службы, указанное в файле /etc/services. Пример проверки того, какое приложение прослушивает порт HTTPS (443):
В приведенных выше примерах будут проверяться как TCP, так и UDP. Если вы хотите проверить только TCP или UDP, добавьте слово tcp или udp. Например, какое приложение использует порт 25 TCP:
или какое приложение использует UDP-порт 53:
10. Как вывести список открытых файлов на основе диапазона портов
Утилита также позволяет составлять список открытых файлов на основе определенного порта или диапазона портов. Например, чтобы отобразить открытые файлы для порта 1-1024, используйте следующую команду:
11. Как составить список открытых файлов в зависимости от типа соединения (TCP или UDP)
Инструмент позволяет составлять список файлов в зависимости от типа подключения. Например, для определенных файлов UDP используйте следующую команду:
Точно так же вы можете заставить lsof отображать файлы, специфичные для TCP.
12. Как сделать lsof список родительских PID процессов
Существует также параметр, который заставляет lsof отображать номер идентификатора родительского процесса (PPID) в выходных данных. Рассматриваемый вариант — -R.
Чтобы получить информацию о PPID для определенного PID, вы можете запустить следующую команду:
13. Как найти сетевую активность пользователя
Используя комбинацию параметров командной строки -i и -u, мы можем искать все сетевые подключения пользователя Linux. Это может быть полезно, если вы проверяете систему, которая могла быть взломана. В этом примере мы проверяем всю сетевую активность пользователя www-data:
14. Список всех отображаемых в память файлов
Эта команда выводит список всех отображаемых в память файлов в Linux.
15. Список всех файлов NFS
Опция -N показывает вам список всех файлов NFS (сетевая файловая система).
Заключение
Хотя lsof предлагает множество опций, тех, которые мы обсуждали здесь, должно быть достаточно для начала работы. После того, как вы попрактикуетесь с ними, перейдите на справочную страницу инструментов, чтобы узнать больше об этом. О, и если у вас есть какие-либо сомнения и вопросы, оставьте комментарий ниже.