Руководство по использованию команды «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
справочная страница.