Как вывести список открытых файлов для процесса в Linux

Руководство по использованию команды «lsof» для процесса

Если вы часто пользуетесь системами Linux или Unix, то наверняка слышали фразу: «В Linux все является файлом». Это может быть отнесено к категории чрезмерного упрощения концепции, но оказывается очень полезным для понимания того, как работают файлы в системе Linux.

Не все, что появляется в среде Linux, должно быть файлом. Иногда это может быть процесс, это может быть специальный файл, представляющий информацию об оборудовании, каталогах и других вещах.

Это руководство поможет вам найти все файлы, открытые для определенного процесса в Linux.

Введение в lsof Командование

Прелесть системы Linux в том, что вы можете контролировать и управлять всей своей системой через терминал, при условии, что вы хорошо знаете команды. Как только команды известны, все задачи на терминале превращаются в легкую прогулку.

lsof означает "Список открытых файлов‘. Как только вы узнаете длинную версию команды, вам станет очень легко понять и продуктивно использовать команду.

В lsof Команда отображает списки открытых файлов, сокетов и каналов. Вы можете легко найти открытые файлы с помощью этой команды. Когда lsof Команда используется без какой-либо опции, она отображает все открытые файлы по отношению к активным запущенным процессам.

Примечание: Убедитесь, что вы используете судо при выполнении команд.

С помощью lsof Командование

Мы изучим вывод lsof подробно. Изучите следующую команду.

sudo lsof | меньше

Примечание: Если мы напрямую запустим lsof , вывод будет очень большим и может создать путаницу для продолжения. Следовательно, здесь я использовал lsof | меньше команда для удобства обучения.

Вывод:

gaurav @ ubuntu: ~ $ sudo lsof | less COMMAND PID TID USER FD TYPE РАЗМЕР УСТРОЙСТВА / OFF ИМЯ УЗЛА kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs 31 root txt unknown / proc / 31 / exe netns 32 root cwd DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt unknown / proc / 32 / exe rcu_tasks 33 root cwd DIR 8,8 4096 2 / rcu_tasks 33 root rtd DIR 8,8 4096 2 / rcu_tasks 33 root txt unknown / proc / 33 / exe kauditd 34 root cwd DIR 8,8 4096 2 / kauditd 34 root rtd DIR 8,8 4096 2 / kauditd 34 root txt unknown / proc / 34 / exe 

Ниже приведены атрибуты, отображаемые с помощью lsof команда.

ПараметрОписание
КомандованиеПоказывает имя команды, открывающей файл.
PIDИдентификационный номер процесса, открывающего файл.
TIDНомер идентификатора потока. Это может быть поток или номер задачи.
ПользовательИдентификатор пользователя или имя пользователя, который является владельцем процесса.
FDПоказывает файловый дескриптор файла.
ТипТип узла, связанного с файлом.
УстройствоПоказывает номера устройств.
Размер / Выкл.Показывает размер файла в байтах.
УзелПоказывает номер inode каталога или родительского каталога.
ИмяПоказывает имя файловой системы, в которой расположен процесс.

Список процессов

Прежде всего, для вас важно получить запущенные процессы и их соответствующие идентификаторы процессов. Linux предоставляет множество команд для перечисления процессов вместе с их атрибутами, такими как PID, пользователь, каталог и т. Д.

Вы можете использовать такие команды, как верхняя, пс, htop, pstree для вывода списка процессов на терминале.

На протяжении всего урока я буду использовать верхняя команду сделать это. В верхняя Команда обеспечивает динамический просмотр работающей системы в реальном времени. Он также отображает все процессы и потоки, которыми в настоящее время управляет ядро ​​Linux. Изучите приведенный ниже блок, чтобы проверить вывод верхняя команда.

Синтаксис:

sudo top

Вывод:

gaurav @ ubuntu: ~ $ sudo top PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND 2703 gaurav 20 0 4286124 1.142g 103584 R 88.2 30.5 87: 48.08 Веб-контент 1173 mongodb 20 0 288536 6776 3428 S 5.9 0.2 2: 34.41 mongod 13765 gaurav 20 0 2931568 131408 47496 S 5.9 3.3 1: 42.34 Веб-контент 1 корень 20 0 225904 6824 4900 S 0.0 0.2 0: 27.25 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0: 00.05 kthreadd 4 root 0-20 0 0 0 I 0.0 0.0 0: 00.00 kworker / 0: 0H 6 root 0-20 0 0 0 I 0.0 0.0 0: 00.00 mm_percpu_wq 7 root 20 0 0 0 0 S 0.0 0.0 0: 01.89 ksoftirqd / 0 8 root 20 0 0 0 0 I 0.0 0.0 0: 22.32 rcu_sched 9 root 20 0 0 0 0 I 0.0 0.0 0: 00.00 rcu_bh 10 root rt 0 0 0 0 S 0.0 0.0 0: 03.13 миграция / 0 

В приведенном выше блоке мы можем видеть всю информацию, относящуюся к процессу, в одном месте. Отсюда мы можем найти PID процесса, в котором мы должны отображать открытые файлы, используя lsof команда.

Но если вы хотите узнать идентификатор процесса только определенного процесса и избежать других нежелательных процессов, используйте следующую команду.

Синтаксис:

sudo top | grep [имя_процесса]

Пример:

gaurav @ ubuntu: ~ $ top | grep terminal 13819 gaurav 20 0 803336 19728 9160 S 0.3 0.5 0: 53.63 gnome-terminal- 13819 gaurav 20 0 803336 19728 9160 S 1.0 0.5 0: 53.66 gnome-terminal- 13819 gaurav 20 0 803336 19728 9160 S 0.3 0.5 0: 53.67 gnome -терминал- gaurav @ ubuntu: ~ $

Здесь мы специально отобразили идентификатор процесса, который имеет строку «терминал» в имени процесса. Этот метод удобен, когда вы не знаете полное имя процесса или PID.

Отображение открытых файлов, связанных с процессом, с использованием PID

В приведенном выше блоке мы узнали, как получить информацию о процессе с помощью команды top. Теперь воспользуемся PID соответствующий любому процессу в системе, и попробуйте отобразить список открытых файлов, связанных с этим процессом, с помощью lsof команда.

Из приведенных выше выходных данных возьмем процесс, соответствующий выделенному PID 1173. Мы будем использовать lsof -p [PID] команду сделать это.

Синтаксис:

sudo lsof -p [PID]

Эта команда принимает PID процесса в качестве входных данных и перечисляет все файлы, соответствующие этому PID.

Вывод:

gaurav @ ubuntu: ~ $ sudo lsof -p 1173 lsof: ПРЕДУПРЕЖДЕНИЕ: невозможно stat () fuse.gvfsd-fuse file system / run / user / 1000 / gvfs Выходная информация может быть неполной. COMMAND PID ПОЛЬЗОВАТЕЛЬ FD ТИП РАЗМЕР УСТРОЙСТВА / ВЫКЛ. ИМЯ УЗЛА mongod 1173 mongodb cwd DIR 8,8 4096 2 / mongod 1173 mongodb rtd DIR 8,8 4096 2 / mongod 1173 mongodb txt REG 8,8 38379496 2885608 / usr / bin / mongod 1173 mongodb mem REG 8,8 71776 2624380 /lib/x86_64-linux-gnu/libnss_myhostname.so.2 mongod 1173 mongodb mem REG 8,8 101168 2624643 /lib/x86_64-linux-gnu/libresolv-2.27.so mongodbod 1173 mongodbod mem REG 8,8 26936 2624439 /lib/x86_64-linux-gnu/libnss_dns-2.27.so mongod 1173 mongodb mem REG 8,8 10160 2626002 /lib/x86_64-linux-gnu/libnss_mdns4_minimal.so.2 mongodbod 1173 mongodb 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mongod 1173 mongodb mem REG 8,8 3004224 2909671 / usr / lib / locale / locale-archive mongod 1173 mongodb mem REG 8,8 2030544 2621501 / lib / x86_64-linux-gnu / libc-2.27.so mongod 1173 mongodb mem REG 8,8 144976 2624627 /lib/x86_64-linux-gnu/libpthread-2.27.so mongod 1173 mongodb mem REG 8,8 96616 2624649 / lib / x86_64-linux-gnu / libgcc_s.so.1 mongod 1173 mongodb мне m REG 8,8 1700792 2622735 /lib/x86_64-linux-gnu/libm-2.27.so mongod 1173 mongodb mem REG 8,8 14560 2621535 /lib/x86_64-linux-gnu/libdl-2.27.so mongod 1173 mongodb mem REG 8,8 31680 2624646 /lib/x86_64-linux-gnu/librt-2.27.so mongod 1173 mongodb mem REG 8,8 2357760 2890079 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 gaurav @ ubuntu : ~ $

Файлы, открытые для процесса с идентификатором процесса 1713, отображаются с помощью lsof команда.

Примечание: Пользователи GNOME могут столкнуться с приведенным ниже предупреждением. Вы можете спокойно игнорировать это.

lsof: ВНИМАНИЕ: невозможно stat () fuse.gvfsd-fuse file system / run / user / 1000 / gvfs Информация о выводе может быть неполной.

Список открытых файлов, связанных с процессом, по имени процесса

В lsof Команда также предоставляет вам возможность перечислить открытые файлы, используя имена процессов. Имена должны быть предоставлены команде в виде входной строки. См. Синтаксис ниже, чтобы использовать эту опцию.

Синтаксис:

sudo lsof -c [имя процесса]

Пример:

sudo lsof -c mysql

Вывод:

gaurav @ ubuntu: ~ $ sudo lsof -c mysql lsof: ПРЕДУПРЕЖДЕНИЕ: невозможно stat () fuse.gvfsd-fuse file system / run / user / 1000 / gvfs Выходная информация может быть неполной. COMMAND PID ПОЛЬЗОВАТЕЛЬ FD ТИП РАЗМЕР УСТРОЙСТВА / ВЫКЛ ИМЯ УЗЛА mysqld 1266 mysql cwd DIR 8,8 4096 3154135 / var / lib / mysql mysqld 1266 mysql rtd DIR 8,8 4096 2 / mysqld 1266 mysql txt REG 8,8 24691368 2889411 / usr / sbin / mysqld mysqld 1266 mysql mem REG 8,8 6288 5505444 /usr/lib/mysql/plugin/auth_socket.so mysqld 1266 mysql DEL REG 0,18 28127 / [aio] mysqld 1266 mysql DEL REG 0,18 28126 / [ aio] mysqld 1266 mysql DEL REG 0,18 28125 / [aio] mysqld 1266 mysql mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mysqld 1266 mysql mem REG 8,8 47576 2624592 / lib / x86_64-linux-gnu / libnss_nis-2.27.so mysqld 1266 mysql mem REG 8,8 39744 2624438 /lib/x86_64-linux-gnu/libnss_compat-2.27.so 

Результатом будет тот, в котором вместо имени процесса используется идентификатор процесса.

Список файлов, открытых сетевыми подключениями

В Linux файлы также могут быть в виде информации о ваших сетевых подключениях, подключениях оборудования и т. Д. Мы можем использовать lsof команда для вывода списка файлов, открытых сетевым подключением. Используйте следующий метод.

sudo lsof -i

Вывод:

gaurav @ ubuntu: ~ $ sudo lsof -i КОМАНДА PID ТИП ПОЛЬЗОВАТЕЛЯ FD РАЗМЕР УСТРОЙСТВА / ВЫКЛ ИМЯ УЗЛА systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost: домен systemd-r 969 systemd-resolve 13u IPv4 17358 0t0 TCP localhost: домен (СЛУШАТЬ) systemd-r 969 systemd-resolve 15u IPv4 1685575 0t0 UDP ubuntu: 48090 -> _ шлюз: домен avahi-dae 1028 avahi 12u IPv4 23810 0t0 UDP *: mdns avahi-dae 1028 avahi 13u IPv6 23811 0t0 UDP *: mdns avahi-dae 1028 avahi 14u IPv4 23812 0t0 UDP *: 58999 avahi-dae 1028 avahi 15u IPv6 23813 0t0 UDP *: 37512 mongod 1173 mongodb 6u IPv4 28149 0t0 TCP IP localhost: 27017 (LISTEN TCP) mysqld 1266 mysql99 local199 mysql (СЛУШАТЬ) apache2 1283 root 4u IPv6 28140 0t0 TCP *: http (СЛУШАТЬ) gaurav @ ubuntu: ~ $

Здесь мы можем увидеть информацию о файлах, которые открываются сетевым подключением, используя lsof -i команда.

Вывод

В этом простом руководстве мы узнали, как составить список открытых файлов для процесса в Linux, используя различные простые в использовании методы. Для большего количества применений lsof команду, см. lsof справочная страница.

Категория: Linux