Команда lsof
Команда lsof отображает информацию о том, какие файлы используются тем или иным процессом. В Linux практически любое взаимодействие с системой рассматривается как взаимодействие с файлом. Если ваше приложение записывает данные в файл или открывает сетевое соединение, то команда отобразит соответствующую информацию по данному взаимодействию. Подобно команде , вы можете использовать команду для проверки открытых сетевых портов. Например, если вы хотите узнать, занят ли в вашей системе 80 порт, то, применив команду , вы получите информацию о том, какой именно процесс в данный момент его использует.
Ниже вы можете видеть, что процесс apache2 прослушивает порт 80. Вы также можете использовать команду для запроса информации по идентификатору процесса, чтобы узнать, по какому пути расположен соответствующий ему двоичный файл:
Имя файла в списке открытых файлов помогает точно определить происхождение процесса, в частности, мы теперь знаем, что это веб-сервер Apache.
8.3. Утилита chroot
Утилита позволяет открыть командную оболочку с измененной корневой директорией. Все файлы, находящиеся вне этой директории, скрываются от пользователя.
В примере ниже мы будем предполагать, что наша система не может загрузиться (например, из-за проблемы с файлом или невозможности монтирования корневой файловой системы).
Мы будем использовать live-систему (загруженную с накопителя CD/DVD/USB) для диагностики нашего сервера. Live-система не будет использовать наш основной жесткий диск в качестве устройства с корневой директорией.
root@livecd:~# df -h | grep root rootfs 186M 11M 175M 6% / /dev/loop0 807M 807M 0 100% /lib/live/mount/rootfs/filesystem.squashfs root@livecd:~# mount | grep root /dev/loop0 on /lib/live/mount/rootfs/filesystem.squashfs type squashfs (ro)
Для последующей проверки мы можем создать тестовый файл и директорию в нашей текущей корневой файловой системе.
root@livecd:~# touch /file42 root@livecd:~# mkdir /dir42 root@livecd:~# ls / bin dir42 home lib64 opt run srv usr boot etc initrd.img media proc sbin sys var dev file42 lib mnt root selinux tmp vmlinuz
В первую очередь мы должны смонтировать корневую файловую систему с нашего диска (который является частью массива , поэтому мы будем использовать файл устройства вместо ).
root@livecd:~# mount /dev/mapper/packer--debian--7-root /mnt
Теперь мы готовы к использованию утилиты для замены корневой файловой системы на файловую систему с нашего диска, смонтированную в директорию.
root@livecd:~# cd /mnt root@livecd:/mnt# chroot /mnt root@livecd:/# ls / bin dev initrd.img lost+found opt run srv usr vmlinuz boot etc lib media proc sbin sys vagrant data home lib64 mnt root selinux tmp var
Наши тестовые файл и директория (file42 и dir42) не отображаются из-за того, что они находятся вне установленной с помощью утилиты корневой директории.
Обратите внимание на то, что chroot-окружения идентично существующему имени узла.
Для завершения работы следует использовать команду exit:
root@livecd:/# exit exit root@livecd:~# ls / bin dir42 home lib64 opt run srv usr boot etc initrd.img media proc sbin sys var dev file42 lib mnt root selinux tmp vmlinuz
Системные команды
/usr/bin/lsb_release -ircd # Узнать версию дистрибутива Linux;
uname -a # Показать версию ядра Linux;
uname -m # Отобразить архитектуру компьютера;
hostname # Показать сетевое имя компьютера;
uptime # Время работы системы без перезагрузки и выключения;
shutdown # Выключение\перезагрузка. Примеры:- shutdown -r now # Перезагрузка;- shutdown -h 20:00 # Выключить питание в 20:00;— shutdown -h now # Выключение;
init 0 # Выключение;init 6 # Перезагрузка;
halt # Выключение;logout # Выйти из системы;reboot # Перезагрузка;dmesg # Показывает log-файл загрузки ОС;cat /proc/cpuinfo # Показать полную информацию о модели процессора (частота, поддерживаемые инструкции и т.д.);cat /proc/meminfo # Показать расширенную информацию о занимаемой оперативной памяти;
swapoff # Отключение swap-разделов. Отключаем swap (данные перемещаются в оперативную память): swapoff -a ;
swapon # Включение swap-разделов. Включаем swap: swapon -a ;
date # Просмотр и изменение даты\времени. Примеры:
— date # Показывает текущую дату и время;
— date 041217002007.00 # Установить системные дату и время. Формат: ММДДЧЧммГГГГ.СС;
Команда netstat
Команда netstat отображает информацию о состоянии сети. Она показывает используемые сетевые порты и входящие соединения к ним. Однако стоит заметить, что команда не входит в базовую поставку Linux; утилита устанавливается вместе с пакетом net-tools.
Предположим, вы проводите локальные эксперименты со своей программой, принимающей входящие подключения от других программ. Может случиться так, что вы получите сообщение об ошибке типа «Необходимый вам порт (или адрес) уже занят». Применив команду с параметрами протокола, процесса и порта, мы увидим, что HTTP-сервер Apache уже использует 80 порт на нижеприведенном хосте:
Значение столбцов lsof
Типов открытых файлов много, и далеко не все столбцы применимы к каждому из них. Поэтому если для каких-то файлов некоторые столбцы не заполнены данными, то это нормально.
- COMMAND: Имя команды, связанной с процессом, который открыл файл.
- PID: Идентификационный номер процесса, который открыл файл.
- TID: Идентификационный номер задачи (потока) . Пустой столбец означает, что это не задача; это процесс.
- TASKCMD: это имя команды задачи. Обычно это будет то же самое, что и процесс, названный в столбце COMMAND, но некоторые реализации задач (например, Linux) позволяют задаче изменить имя своей команды.
- USER: это идентификационный номер пользователя или логин пользователя, которому принадлежит процесс, обычно то же самое, что сообщает ps. Однако в Linux USER — это идентификационный номер пользователя или логин, который владеет каталогом в /proc, где lsof находит информацию о процессе. Обычно это то же самое значение, которое сообщает ps, но может отличаться, если процесс изменил свой эффективный идентификатор пользователя (также смотрите Что такое файловая система /proc в Linux)
- FD: показывает файловый дескриптор файла. Файловые дескрипторы описаны ниже.
- TYPE: тип узла, связанного с файлом. Виды данных типов описаны ниже.
- DEVICE: содержит номера устройств, разделённые запятыми, для специальных символьных, специальных блочных, обычных файлов, каталогов или NFS. Также может отображаться базовый адрес или имя устройства с сокетом Linux AX.25.
- SIZE/OFF: Показывает размер файла или смещение файла в байтах.
- NODE: Показывает номер узла локального файла или номер узла NFS-файла на хосте сервера или тип интернет-протокола. Может отображаться STR для потока, IRQ или номер инода устройства с сокетом Linux AX.25.
- NAME: для обычных файлов показывает имя точки монтирования и файловой системы, в которой находится файл. Для других типов файлов здесь указываются специфичные для них данные, подробности будут даны ниже.
Команда top
Команда top отображает и обновляет отсортированную информацию о текущем процессе (или процессах). Используйте её, чтобы определить, какие процессы в данный момент запущены и сколько памяти и ресурсов процессора они потребляют. Обычно бывает так, что вы запускаете приложение, и оно через минуту «умирает». Проверив соответствующий лог-файл, вы замечаете запись, указывающую на ошибку памяти:
Действительно ли вашему приложению не хватает памяти? Чтобы подтвердить эту догадку, применяем команду и смотрим, какое количество ресурсов процессора и памяти потребляется приложением. В результате этого замечаем, что основную нагрузку на процессор и память создает процесс python3.
Нажав клавишу , вы можете увидеть полную команду, которая запустила приложение.
Оказывается, это действительно ваше приложение (memeater.py). Когда у него закончится память, система убьет процесс, выдав ошибку «out-of-memory» (OOM).
fuser command
Find out the processes PID that opened tcp port 7000, enter: Sample outputs:
7000/tcp: 3813
Finally, find out process name associated with PID # 3813, enter: Sample outputs:
lrwxrwxrwx 1 vivek vivek 0 2010-10-29 11:00 /proc/3813/exe -> /usr/bin/transmission
/usr/bin/transmission is a bittorrent client, enter: OR Sample outputs:
transmission (1) - a bittorrent client
Find Out Current Working Directory Of a Process
To find out current working directory of a process called bittorrent or pid 3813, enter: Sample outputs:
lrwxrwxrwx 1 vivek vivek 0 2010-10-29 12:04 /proc/3813/cwd -> /home/vivek
OR use pwdx command, enter: Sample outputs:
3813: /home/vivek
Find Out Owner Of a Process on Linux
Use the following command to find out the owner of a process PID called 3813: OR Sample outputs:
vivek 3813 1.9 0.3 188372 26628 ? Sl 10:58 2:27 transmission
OR try the following ps command: Sample outputs:
3813 vivek vivek transmission 02:44:05 Fri Oct 29 10:58:40 2010
Another option is /proc/$PID/environ, enter: OR Sample outputs (note –colour option):
Fig.01: grep output
Пример: 13) Список всех сетевых подключений (lsof -i)
Используйте опцию «-i» в команде lsof, чтобы вывести список всех связанных с сетью процессов или команд, пример показан ниже,
~]# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 41u IPv4 16863 0t0 TCP *:sunrpc (LISTEN) systemd 1 root 43u IPv4 16864 0t0 UDP *:sunrpc rpcbind 1663 rpc 4u IPv4 16863 0t0 TCP *:sunrpc (LISTEN) rpcbind 1663 rpc 5u IPv4 16864 0t0 UDP *:sunrpc rpcbind 1663 rpc 11u IPv6 17051 0t0 UDP *:988 sshd 2294 root 3u IPv4 19949 0t0 TCP *:ssh (LISTEN) sshd 2294 root 4u IPv6 19965 0t0 TCP *:ssh (LISTEN) rpc.statd 2300 rpcuser 10u IPv6 19974 0t0 UDP *:48486 rpc.statd 2300 rpcuser 11u IPv6 20045 0t0 TCP *:39334 (LISTEN) rpc.mount 2311 root 7u IPv4 19897 0t0 UDP *:mountd rpc.mount 2311 root 8u IPv4 19911 0t0 TCP *:mountd (LISTEN) master 2433 root 13u IPv4 21026 0t0 TCP localhost:smtp (LISTEN) master 2433 root 14u IPv6 21027 0t0 TCP localhost:smtp (LISTEN) dhclient 2563 root 6u IPv4 21589 0t0 UDP *:bootpc dhclient 2583 root 21u IPv6 21365 0t0 UDP *:10368 sshd 2600 root 3u IPv4 21737 0t0 TCP 192.168.1.3:ssh->192.168.1.9:52393 (ESTABLISHED) sshd 2659 root 3u IPv4 22056 0t0 TCP 192.168.1.3:ssh->192.168.1.9:52486 (ESTABLISHED) ~]#
Опции команды
Поскольку просматривать
вывод команды lsof, запущенной без параметров, достаточно неудобно,
можно сократить объем выдаваемых данных, конкретизировав ваш запрос,
что достигается за счет использования опций. Опций у этой утилиты
довольно много и большинство из них действует по принципу ограничения
вывода. Если вы указываете, например, опцию -U, то будут выведены
только данные о сокетах UNIX, а все другие файлы игнорируются. Если
указать две или более опций, то их действие определяется правилом
ИЛИ, то есть выводится информация, определяемая каждой из опций.
Например, команда
/usr/sbin/lsof
-U -u kos
выдаст
данные о всех открытых UNIX-сокетах и всех файлах, принадлежащих
процессам, запущенным пользователем “kos”.
Если
же необходимо скомбинировать действие опций по принципу логического
И, то это делается путем специальной опции -a. Например, команда
/usr/sbin/lsof
-a -U -u kos
выдаст
список только сокетов UNIX, принадлежащих процессам, владельцем
которых является пользователь “kos”’
Обратите внимание
на то, что опция -a стоит не между объединяемыми ею другими опциями.
Впрочем, ее можно ставить где угодно, все равно все перечисленные в
командной строке опции будут работать по принципу “логическое
И”
Но если
указывается, например, несколько однотипных опций, то вначале к ним
применяется операция логического ИЛИ, а затем уже работает опция -a.
Пример: по команде
/usr/sbin/lsof
-i@aaa.bbb -i@ccc.ddd -a -ufff,ggg
будет
выведен список файлов, принадлежащих ЛИБО пользователю “fff”,
ЛИБО пользователю “ggg” И имеющих сетевые соединения ЛИБО
к хосту aaa.bbb ЛИБО к хосту ccc.ddd.
Опции
команды lsof можно записывать одну
за другой без пробелов, предваряя это список всего одним дефисом, то
есть вместо
/usr/sbin/lsof -a -b -C
можно указать просто
/usr/sbin/lsof -abC
Однако при этом надо побеспокоиться о том, чтобы не было неоднозначности в
интерпретации опций. Но я не буду детально рассматривать возможные
причины неоднозначности, если у вас возникает желание использовать
эту возможность, смотрите соответствующую man-страницу.
Отмечу только, что существует ряд опций, которые позволяют
изменить вывод программы lsof. Например, опция -R заставляет lsof
дополнительно выводить данные об идентификаторе родительского
процесса. Очень интересной может оказаться опция -F. Запущенная с
этой опцией утилита lsof выдает информацию не в виде таблицы, а в
виде последовательности отдельных строк. В таком случае вывод можно
перенаправить на вход другой программы, которая будет каким-либо
образом обрабатывать полученную информацию. После опции -F можно
указать, какие именно поля будут присутствовать в выводе. Например,
если командная строка имела вид
$ /usr/sbin/lsof -F pcfn |
в выводе lsof будет присутствовать
идентификатор процесса (p), имя команды (c), файловый дескриптор (f)
и ися файла.
Мониторинг состояния и диагностика Linux-сервера с помощью утилиты sysdig
О какой утилите вы в первую очередь подумаете, если столкнетесь с необходимостью отслеживания системных вызовов, использованных процессом? Наверняка это будет утилита , которая отлично подойдет для решения данной задачи. Какой инструмент с интерфейсом командной строки вы используете для исследования сетевого трафика? Если вы выберите , вы точно не ошибетесь. А если вам когда-нибудь понадобится отследить файлы, открытые процессом (напомню, что в соответствии с философией Unix, все является файлом), велика вероятность того, что вы воспользуетесь утилитой .
Утилиты , и на самом деле являются отличными инструментами, которые должны использоваться каждым системным администратором и именно по этой причине вам должна понравиться утилита , ведь она является мощным инструментом с открытым исходным кодом для низкоуровнего мониторинга состояния и диагностики систем, представляемым разработчиками как «strace + tcpdump + lsof + отличный соус с небольшой вишенкой в виде Lua сверху». Если говорить серьезно, одно из наиболее важных преимуществ утилиты sysdig заключается в том, что с помощью нее вы можете не только анализировать текущее состояние Linux-системы, но также и сохранять данные ее состояния в файл для последующего анализа. Кроме того, вы можете настроить поведение sysdig или даже расширить ее возможности с помощью поставляемых в комплекте (или созданных собственноручно) небольших сценариев (chisels).
Отдельные сценарии могут использоваться для анализа захваченных с помощью sysdig потоков событий с задействовнием различных реализованных в их рамках методов анализа.
В данной статье мы постараемся разобраться с установкой и использованием sysdig для мониторинга состояния и диагностики Linux-системы.
Установка sysdig
В данном руководстве будет использоваться автоматическая процедура установки, описанная на официальном веб-сайте проекта ввиду ее простоты, очевидности и независимости от используемого дистрибутива. В ходе автоматического процесса установки запущенный сценарий самостоятельно определит тип используемой операционной системы и установит все необходимые зависимости.
Выполните следующую команду от лица пользователя root для установки sysdig из официального репозитория apt/yum:
# curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | bash
После завершения процесса установки у вас появится возможность запуска утилиты sysdig для ознакомления с ее возможностями с помощью следующей команды:
# sysdig
Сразу же после этого экран вашего монитора должен заполниться информацией о состоянии вашей системы, с которой вы не сможете ничего сделать. По этой причине в первую очередь разумнее воспользоваться командой
# sysdig -cl | less
для ознакомления со списком доступных сценариев.
По умолчанию вам должны быть доступны следующие категории, каждая из которых должна содержать по нескольку сценариев.
- CPU Usage (сценарии, осуществляющие мониторинг нагрузки на центральный процессор)
- Error (сценарии, осуществляющие отслеживание системных ошибок)
- I/O (сценарии, осуществляющие мониторинг операций ввода/вывода)
- Logs (сценарии для работы с системными журналами)
- Misc (дополнительные сценарии)
- Net (сценарии, осуществляющие мониторинг сетевой активности)
- Performance (сценарии, осуществляющие мониторинг показателей производительности системы)
- Security (сценарии, отслеживающие проблемы безопасности)
- System State (сценарии, осуществляющие мониторинг состояния системы)
Для вывода информации об использовании определенного сценария (включая детальное описание параметров командной строки) следует использовать следующую команду:
# sysdig -cl
Например, мы можем получить информацию об сценарии spy_port из категории «Net», выполнив следующую команду:
# sysdig -i spy_port
Сценарии могут комбинироваться с фильтрами (которые применяются как к данным, захватываемым в реальном времени, так и к данным из файлов событий) для получения более удобного для чтения вывода.
Имена фильтров соответствуют схеме . Например:
- : IP-адрес клиента.
- : направление события, либо для входящих событий, либо для исходящих событий.
Для получения полного списка фильтров следует использовать следующую команду:
# sysdig -l
Далее в статье будет продемонстрировано несколько примеров использования sysdig.
Пользователи и группы
id # Показывает сводную информацию по текущему пользователю (логин, UID, GID, группы);
adduser # Добавление нового пользователя. Пример добавления пользователя it: adduser it ;
passwd # Меняет пароль текущего пользователя;
groupadd # Добавление новой группы. Пример: groupadd ITgr ;
usermod # Изменения настроек пользователя. usermod -a -G ITgr it добавляет пользователя it в группу ITgr;
userdel # Удаление пользователя. Пример: userdel it ;
groupdel # Удаление группы. Пример: groupdel ITgr ;
users # Отображает краткий список пользователей работающих в системе в данный момент;
exit # Завершить сеанс текущего пользователя;
last # Отобразить регистрации пользователей в системе;
Перечислите все сетевые соединения
Вы можете перечислить все сетевые подключения, открытые с помощью ‘-I’ вариант.
# lsof -i
lsof -i
Получить только траффик сIPv6 с опцией -i 6
# lsof -i 6
Показать только соединения TCP (работает то же самое и для UDP), вы можете также показать только TCP или UDP соединения, предоставляя протокол сразу после -i:
# lsof -iTCP
или
# lsof -iUDP
Показать сети, связанный с данным портом с помощью -i: порт:
# lsof -i :21
Показать соединения к определенному хосту с помощью «host». Это очень полезно, когда вы ищете, есть ли у вас открытые соединения с данного хоста в сети или по интернету.
# lsof -i@147.136.112.45
Показать соединения к определенному хосту с помощью @host:port. Вы также можете комбинировать отображение хост и порт:
# lsof -i@12.136.112.55:21
Найти прослушивающие порты, которые ждут соединения:
# lsof -i -sTCP:LISTEN
Вы также можете отсеять не нужно и вывести например, только «LISTEN»:
# lsof -i | grep -i LISTEN
Найти установленные соединения. Вы можете также показать любые соединения, которые уже установлены на сервере:
# lsof -i -sTCP:ESTABLISHED
Вы можете отгрепать мусор и найти что-то для себя, например:
# lsof -i | grep -i ESTABLISHED
Абсолютно первые шаги
Кто я, где я?
- — выводит имя машины (сервера), на которой вы сейчас находитесь;
- — выводит ваш логин (ваше имя в системе);
- — псевдографическое изображение дерева каталогов на машине; выход из пролистывания — ;
- — выводит каталог, в котором вы сейчас находитесь; в командной строке вы не можете быть «просто так», вы обязательно находитесь в каком-то каталоге (=текущий каталог, рабочий каталог). Вероятно, текущий рабочий каталог выводится у вас в приглашении (prompt).
- — список файлов в текущем каталоге; — список файлов в указанном каталоге;
man
- 1 — исполняемые программы и шелльные команды (, , и т.п.);
- 2 — системные вызовы (, и т.п.)
- 3 — библиотечные функции (, , , ).
Что делать, когда что-то непонятно
- насколько возможно четко сформулируйте вопрос или задачу — нет ничего сложнее, чем решать «то, не знаю что»;
- вспомните, сталкивались ли вы уже с такой же или подобной проблемой — в этом случае стоит попробовать решение, которое сработало в прошлый раз;
- почитайте подходящие man-ы (если понимаете, какие man-ы подходят в вашем случае) — возможно, вы найдете подходящие примеры использования команд, нужные опции или ссылки на другие команды;
- подумайте: нельзя ли немного поменять задачу? — возможно, чуть-чуть изменив условия, вы получите задачу, которую уже умеете решать;
- задайте свой четко сформулированный вопрос в поисковой системе — возможно, ответ найдется на Stack Overflow или других сайтах;
Методы работы
Скопировать-и-вставитьЧитать manВытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить
Базовые команды
- переход в другой каталог: ;
- просмотр содержимого файлов: , , , ;
- манипуляции с файлами: , , ;
- просмотр содержимого каталогов: , , ;
- структура каталогов: , (можно передать в качестве параметра каталог);
- поиск файлов: ;
Аналитика
- , ;
- — сортировка по указанному полю;
- — числовая соритровка;
- — сравнение файлов;
- , , , , — поиск текста;
- , — уникализация строк;
- — в варианте , чтобы оставить только первое поле из каждой строки, можно менять на , и т.д.;
Диагностика системы
- — информация о процессах (запущенных программах), работающих на машине;
- — интерактивный просмотр самых ресурсоемких процессов;
- — занятое и свободное место на диске;
- — суммарный размер файлов в каталоге (рекурсивно с подкаталогами);
- , — какие системные вызовы выполняет процесс;
- — какие файлы использует процесс;
- , — какие порты и сокеты открыты в системе.
Массовое и полуавтоматическое выполнение
- — проврека условий;
- — цикл по строчкам ;
- — подстановка строк из в параметры указанной программе;
- — генерация последовательностей натуральных чисел;
- — объединить вывод нескольких команд;
- — выполнить одно за другим;
- — выполнить при условии успешного завершения первой команды;
- — выполнить при условии неудачного завершения первой команды;
- — продублировать вывод программы в и в файл на диске.
Разное
- — текущая дата;
- — скачивает документ по указаному url и пишет результат на ;
- — обновить дату модификации файла;
- — послать процессу сигнал;
- — ничего не делает, возвращает истину, полезна для организации вечных циклов;
- — выполнить команду от имени ‘а.
Команда curl
Команда curl позволяет взаимодействовать с внешними ресурсами посредством URL-адресов. Часто данная команда применяется для определения того, может ли ваше приложение связаться с другой службой, например, с базой данных, или для проверки работоспособности вашей службы.
Представьте, что у нас есть база данных MongoDB, которая не может связаться с внешним приложением, выдавая при этом сообщение об ошибке HTTP 500:
Параметр выводит информацию о заголовке HTTP-запроса, а параметр отвечает за тихий (silent) режим, при котором опускается тело HTTP-ответа от сервера. В то же время, проверка подключения к базе данных с локального хоста проходит успешно:
Так в чем же может быть проблема? Для начала необходимо проверить, можем ли мы с хоста, на котором установлено наше приложение, достучаться до других ресурсов, кроме базы данных:
Вроде всё в порядке. Теперь попробуем связаться с базой данных. Т.к. для подключения к базе данных наше приложение использует имя хоста базы данных, то сначала попробуем выполнить следующую команду:
Вывод команды означает, что заданный URL-адрес недоступен или хост не имеет соответствующим образом настроенного DNS-сервера, который можно использовать для сопоставления имени и IP-адреса.
Команда du
Команда du используется для получения информации о том, какие файлы (и в каком объеме) используют дисковое пространство в заданном каталоге. Например, если вы хотите узнать, какой лог-файл занимает больше всего места в каталоге /var/log, вы можете использовать команду с параметром (для отображения занимаемого места) и параметром (читабельный формат):
В этом примере видно, что самым большим каталогом в каталоге /var/log является /var/log/apt. Применение команды в сочетании с командой поможет вам быстро определить, что и в каких объемах использует дисковое пространство на вашем компьютере.
Список всех открытых файлов с помощью команды lsof
В приведенном ниже примере показан длинный список открытых файлов, которые отображают такие столбцы, как Command, PID, USER, FD, TYPE и т.д.
# lsof 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 145180 147164 /sbin/init init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so init 1 root 0u CHR 1,3 0t0 3764 /dev/null init 1 root 1u CHR 1,3 0t0 3764 /dev/null init 1 root 2u CHR 1,3 0t0 3764 /dev/null init 1 root 3r FIFO 0,8 0t0 8449 pipe init 1 root 4w FIFO 0,8 0t0 8449 pipe init 1 root 5r DIR 0,10 0 1 inotify init 1 root 6r DIR 0,10 0 1 inotify init 1 root 7u unix 0xc1513880 0t0 8450 socket
Разделы и их значения не требуют пояснений. Однако мы рассмотрим столбцы FD и TYPE более подробно.
FD – обозначает дескриптор файла и может иметь такие значения, как:
- cwd – текущий рабочий каталог
- rtd – корневой каталог
- txt – текст программы (код и данные)
- mem – файл памяти
Также в столбце FD номера, например 1u — это фактический дескриптор файла, за которым следуют u,r,w как режим доступа:
- r – доступа для чтения.
- w – доступа для записи.
- u – чтения и записи.
TYPE — файлов и их идентификация.
- DIR – директория
- REG – обычный файл
- CHR – специальный символьный файл.
- FIFO – First In First Out
8.1. Утилита lsof
С помощью утилиты вы можете получить список открытых файлов.
При использовании утилиты без параметров будет выводиться список, содержащий все открытые файлы. В данном списке вы можете обнаружить строку команды (в данном случае это команда init), идентификатор созданного процесса в столбце PID (1), а также имя пользователя (root), с привилегиями которого была открыта корневая директория и файл . Данные из столбца FD (содержащего информацию о дескрипторе файла) говорят о том, что директория / являлась как корневой директорией (rtd), так и текущей рабочей директорией (cwd) при исполнении команды /sbin/init. В столбце FD может содержаться строка , указывающая на то, что директория является корневой директорией, строка , указывающая на то, что директория является текущей рабочей директорией и строка , указывающая не то, что открыт файл (включая файлы с данными и кодом).
root@debian7:~# lsof | head -4 COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 254,0 4096 2 / init 1 root rtd DIR 254,0 4096 2 / init 1 root txt REG 254,0 36992 130856 /sbin/init
В остальных случаях в столбце FD приводятся числовые значения дескрипторов с символами, соответствующими режимам открытия файлов, причем символ w соответствует режиму записи данных, r — режиму чтения данных, а u — режиму чтения и записи данных. Вы можете вывести список файлов, открытых в рамках процесса с определенным идентификатором PID, воспользовавшись командой . Для процесса данная команда будет выглядеть следующим образом:
lsof -p 1
В приведенном ниже примере показана простая методика использования утилиты для доказательства того, что текстовый редактор хранит файл с расширением в открытом состоянии (даже в том случае, если исполнение соответствующего процесса приостанавливается в фоновом режиме) при работе с нашей недавно смонтированной файловой системой.
# df -h | grep sdb /dev/sdb1 541M 17M 497M 4% /srv/project33 # vi /srv/project33/busyfile.txt + Stopped vi /srv/project33/busyfile.txt # lsof /srv/* COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME vi 3243 root 3u REG 8,17 4096 12 /srv/project33/.busyfile.txt.swp
А здесь мы видим, что демон открывает несколько файлов журналов для записи (как указано в строке FD).
root@debian7:~# lsof /var/log/*
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 2013 root 1w REG 254,0 454297 1308187 /var/log/syslog rsyslogd 2013 root 2w REG 254,0 419328 1308189 /var/log/kern.log rsyslogd 2013 root 5w REG 254,0 116725 1308200 /var/log/debug rsyslogd 2013 root 6w REG 254,0 309847 1308201 /var/log/messages rsyslogd 2013 root 7w REG 254,0 17591 1308188 /var/log/daemon.log rsyslogd 2013 root 8w REG 254,0 101768 1308186 /var/log/auth.log
Вы можете указать имя интересующего вас пользователя в рамках команды . В данном примере выводится информация о текущих рабочих директориях нескольких программ с интерфейсом командной строки, запущенных от лица пользователя paul.
$ lsof -u paul | grep home bash 3302 paul cwd DIR 253,0 4096 788024 /home/paul lsof 3329 paul cwd DIR 253,0 4096 788024 /home/paul grep 3330 paul cwd DIR 253,0 4096 788024 /home/paul lsof 3331 paul cwd DIR 253,0 4096 788024 /home/paul
Совместно с параметром -u утилиты также может быть использовать символ ^, соответствующий логической операции ‘не’. Исходя из этого, команда для получения информации обо всех открытых файлах, за исключением тех файлов, которые открыты пользователем root, будет выглядеть следующим образом:
lsof -u^root
Исключение пользователя с помощью символа ‘^’
Здесь мы исключили пользователя root. Вы можете исключить любого пользователя, используя команду ‘^‘ как показано выше.
# lsof -i -u^root COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN) rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 rpc.statd 1277 rpcuser 5r IPv4 11836 0t0 UDP *:soap-beep rpc.statd 1277 rpcuser 8u IPv4 11850 0t0 UDP *:55146 rpc.statd 1277 rpcuser 9u IPv4 11854 0t0 TCP *:32981 (LISTEN) rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)
Автоматическое обновление выводимой информации lsof
Чтобы перевести lsof в режим повтора, мы можем использовать опцию +r СЕКУНДЫ или её вариант -r СЕКУНДЫ. Опцию повторения можно применить двумя способами: +r или -r. Мы также должны добавить количество секунд, которое мы хотим, чтобы lsof ожидал перед обновлением дисплея.
Использование опции повтора в любом формате заставляет lsof отображать результаты как обычно, но добавляет пунктирную линию внизу экрана. Программа ожидает количество секунд, указанное в командной строке, а затем обновляет дисплей новым набором результатов.
С опцией -r это будет продолжаться пока вы не нажмете Ctrl+c. В формате +r программа будет продолжаться до тех пор, пока не будет получен пустой результат, или пока вы не нажмете Ctrl+c.
sudo lsof -u mial -c ssh -a -r5
Обратите внимание на пунктирную линию (=======) внизу списка. Она отделяет каждое новое отображение данных при обновлении вывода.
Заключение
В конце статьи можно сформулировать следующий вывод: поскольку
файл и процесс – два ключевых понятия в операционной системе,
утилита lsof может оказаться незаменимым помощником администратора в
тех случаях, когда надо разобраться, как работает система, а особенно
в тех случаях, когда система скомпрометирована. И она тем полезнее,
чем больше ваша система и чем больше вы с ней работаете, чем лучше вы
понимаете, что она может. Когда вы освоите ее возможности, вы сможете
создать отдельные скрипты для обработки тех огромных массивов
информации, которые выдает эта программа. Можно, например, запускать
команду lsof -i через определенные промежутки времени, чтобы
сравнивать полученные данные. Если будут выявлены отличия в числе
открытых процессов или другие отличия, удовлетворяющие заданному
критерию, скрипт может сформировать сообщение администратору.
Мы рассмотрели только малую часть
возможностей этой утилиты. Более подробную информацию ищите на
соответствующей man-страничке.
Можно еще отметить, что для lsof разработана графическая оболочка,
называемая GLSOF. Ее можно получить с сайта
http://glsof.sourceforge.net/.
Ссылки:
- http://rus-linux.net
- С.Лапшанский,
“Кто использует эти файлы”, перевод статьи Майкла Лукаса
(URL: ). - В.А.Костромин,
“Linux для пользователя”, БХВ-Петербург, 2002 г. - “Meet the Amazing Mr. Lsof” (URL:
) - Indiana
University, Unix Workstation Support Group, «Unix for Advanced
Users”. 15.9. List Open Files: lsof
and fuser
(URL: - Thomas
Nooning, “Track network connections with LSOF on Linux”
(URL:
. - Martin
Zahn, “Introduction to lsof”, (URL:
). - “Installing, configuring and
using lsof 4.50 to list open files on systems running Solaris 2.x”
(URL:
)