Использование команды lsof в linux с примерами

Команда 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
[email protected] [email protected] -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 [email protected]

Показать соединения к определенному хосту с помощью @host:port. Вы также можете комбинировать отображение хост и порт:

# lsof [email protected]: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/.

Ссылки:

  1. http://rus-linux.net
  2. С.Лапшанский,
    “Кто использует эти файлы”, перевод статьи Майкла Лукаса
    (URL: ).
  3. В.А.Костромин,
    “Linux для пользователя”, БХВ-Петербург, 2002 г.
  4. “Meet the Amazing Mr. Lsof” (URL:
    )
  5. Indiana
    University, Unix Workstation Support Group, «Unix for Advanced
    Users”. 15.9. List Open Files: lsof
    and fuser
    (URL:
  6. Thomas
    Nooning, “Track network connections with LSOF on Linux”
    (URL:
    .
  7. Martin
    Zahn, “Introduction to lsof”, (URL:
    ).
  8. “Installing, configuring and
    using lsof 4.50 to list open files on systems running Solaris 2.x”
    (URL:
    )
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: