...

Эффективное использование lsof: анализ открытых файлов и процессов

Я установил lsof linux , чтобы за считанные секунды увидеть, какой процесс держит открытым какой файл, сокет или порт. Так я выявляю заблокированные журналы, занятые Порты и без лишних хлопот работаю с заблокированными файлами, а также целенаправленно устраняю сбои.

Центральные пункты

Чтобы начало прошло успешно, я кратко изложу самые важные Аспекты вкратце.

  • Ресурсы отображать: процессы, файлы, каталоги, устройства, каналы, сокеты.
  • Фильтры использовать: по имени процесса (-c), PID (-p), пользователю (-u), файлу, каталогу (+d/+D), порту (-i).
  • Ошибка ограничить: найти заблокированные файлы, устранить конфликты портов, определить зависшие службы.
  • Сеть проверка: быстрое выявление активных соединений и занятых портов.
  • Рабочий процесс оптимизировать: сначала сузить круг, затем провести целенаправленную проверку, а после этого принять меры.

Почему lsof важен в повседневной жизни

Я использую lsof, если служба не запускается, файл возвращает статус „busy“ или порт уже занят. Этот инструмент связывает файл, процесс, пользователя и сеть в единую четкую Посмотреть. Я сразу вижу, какой PID удерживает доступ и с какого момента. Таким образом, я действую, а не гадаю, и завершаю нужный процесс, вместо того чтобы случайно остановить не тот сервис. Особенно на рабочих серверах это позволяет мне сэкономить от нескольких минут до нескольких часов, поскольку я могу определить причину непосредственно по процессу. Такой подход сокращает количество заявок в службу поддержки, уменьшает количество сбоев и обеспечивает надежную работу системы. Выводы.

Понимание основного синтаксиса и вывода

Основная форма звучит так: lsof [опции] и без параметров возвращает все открытые в данный момент объекты. На системах с высокой нагрузкой я фильтрую вывод, вместо того чтобы просматривать тысячи строк. Важно, что в Linux понятие „файл“ трактуется широко: к нему относятся каталоги, устройства, библиотеки и сетевыеРозетки. В выводе полезны такие столбцы, как COMMAND, PID, USER, FD, TYPE, NAME. В первую очередь я обращаю внимание на FD (дескриптор файла), TYPE (REG, DIR, IPv4/6) и NAME с указанием пути или порта. Прочитав эти столбцы, можно быстро понять текущее состояние системы и четко распределить ресурсы Процессы.

Установка и права доступа на практике

Во многих дистрибутивах lsof не предустановлено. Поэтому я устанавливаю его заранее через менеджер пакетов (apt install lsof, dnf install lsof, yum install lsof или pacman -S lsof), чтобы в случае инцидента он был сразу доступен. Для получения полной картины я обычно запускаю lsof с судо , поскольку без расширенных прав многие записи завершаются сообщением „permission denied“ или вовсе отсутствуют. Тем не менее я сознательно начинаю работу без root-прав, проверяю, как далеко я смогу зайти, и повышаю права только в случае необходимости. В системах с SELinux или AppArmor я учитываю, что контексты безопасности могут ограничивать доступ к информации; в зависимости от сборки отображается lsof Добавляю контексты. При массовых запросах я подавляю предупреждения с помощью -w, чтобы скрипты оставались отказоустойчивыми.

Безопасное чтение полей и типов FD

Колонка FD — это мой ключ к пониманию. Типичные значения:

  • cwd: текущий рабочий каталог процесса.
  • txt: исполняемый файл (текстовый сегмент) процесса.
  • mem: загруженные общие библиотеки и отображенные файлы (отображение в памяти).
  • 0u, 1w, 2w: Стандартные дескрипторы (stdin, stdout, stderr) с режимом r (читать), w (запись) или u (чтение/запись).
  • более высокие цифры, такие как 3u, 7r: обычные открытые дескрипторы, часто представляющие собой файлы, сокеты или каналы.

Из ТИП Я читаю класс объекта: REG (обычный файл), DIR (каталог), CHR/BLK (устройство для рисования/блоков), FIFO (труба), IPv4/IPv6 (сеть), UNIX (сокет домена Unix). В ИМЯ указывается путь или, в случае сокетов, конечная точка, например:. TCP *:80 (LISTEN) или UDP 127.0.0.1:123. Если я (удалено) В итоге я вижу, что файл был удалён, но по-прежнему удерживается PID — типичная причина „исчезновения“ места на диске.

Целевая фильтрация: файлы, каталоги, порты

Сначала я определю контекст, а затем начну с подходящего Фильтры. Для каталога я использую lsof +D /var/log (рекурсивно) или lsof +d /var/log (только сама папка). Отдельные файлы я проверяю напрямую, например lsof /var/log/syslog, чтобы просматривать процессы записи. Для портов я устанавливаю lsof -i:80, lsof -i:443 или в общем смысле lsof -i . Я люблю сочетать это с -nP, чтобы lsof не преобразовывал IP-адреса и порты и работал быстрее. Таким образом, из запутанного состояния системы в кратчайшие сроки формируется четкая картина Изображение.

Объединение и уточнение фильтров

Для получения воспроизводимых результатов анализа я использую фильтры в сочетании с -a логически связаны. Таким образом, я получаю только записи, которые соответствуют всем условиям. Примеры:

  • lsof -a -p 1234 -d cwd,txt,mem – только рабочий каталог, двоичный файл и загруженные библиотеки процесса.
  • lsof -a -iTCP -sTCP:ESTABLISHED -p 1234 – только установленные TCP-соединения с определенным PID.
  • lsof -a -u www-data +d /var/www – Файлы, расположенные в каталоге /var/www, которые удерживают открытыми процессы пользователя www-data.

С -d я фильтрую по дескрипторам (числам или названиям, таким как cwd, mem). -U позволяет целенаправленно выводить в вывод Unix-доменные сокеты, когда мне нужно исследовать проблемы с локальным межпроцессным взаимодействием. Таким образом я уменьшаю количество лишней информации и вижу именно то, что имеет отношение к вопросу.

Быстрое сопоставление процессов и пользователей

Если я знаю название службы, то lsof -c nginx все открытые файлы веб-сервера, включая Библиотеки, конфигурации и сокеты. Для точного анализа я часто использую PID: lsof -p 1234 отображает все дескрипторы конкретного процесса. Проверки, связанные с пользователем, я выполняю с помощью lsof -u mysql или другой учетной записью, чтобы отобразить ресурсы, открытые учетной записью службы. В более подробных анализах я дополняю представление процессов с помощью Учёт производственных процессов и вижу, как часто и как долго программы используют ресурсы. Такое сочетание данных о процессах, пользователях и действиях позволяет мне быстро разобраться в сложных явлениях Причина.

Особые случаи: удаленные файлы, Logrotate и файлы, занимающие много места

Если „не хватает“ места на диске, я часто нахожу причину с помощью lsof +L1: В нём отображаются файлы, которые уже удалены, но по-прежнему удерживаются открытыми процессами. Типичными примерами являются ротированные журналы, большие временные файлы или дампы отладки. Вместо того чтобы в спешке увеличивать размер раздела, я целенаправленно завершаю отображаемые PID или посылаю стандартный сигнал для перезагрузки. Для служб ведения журналов я предпочитаю выполнять чистую перезагрузку соответствующей службы, чтобы дескрипторы были открыты заново. Временные решения, такие как truncate или непосредственное удаление без перезапуска процесса лишь откладывает решение проблемы.

При работе с длинными потоками данных я дополнительно проверяю столбец SIZE/OFF (отображается в зависимости от сборки), чтобы определить, не привязан ли какой-либо процесс к очень большому смещению. Это объясняет, почему дескриптор занимает столько памяти, хотя файл помечен как удаленный.

Систематическое устранение типичных неисправностей

Заблокированные файлы я удаляю после того, как lsof показал мне, как правильно это сделать. Вместо того чтобы бессистемно останавливать службы, я целенаправленно завершаю процесс по PID или перезапускаю именно эту службу. Конфликты портов я устраняю с помощью lsof -i:, просматриваю PID, к которому он привязан, и настраиваю порт, службу или брандмауэр соответственно. Если процесс завис, я проверяю его открытые дескрипторы с помощью lsof -p и определить, ожидает ли он файла, канала или сокета. Для углубленного анализа я дополняю этот вид следующим образом: целенаправленное использование strace, чтобы в режиме реального времени отслеживать системные вызовы. Так я надежно устраняю повторяющиеся сбои и документирую последовательность действий для будущих Инциденты.

Учитывать контейнеры и пространства имён

Объяснение в контексте контейнерных сред (например, с собственными сетевыми пространствами имён) lsof у меня возникают несоответствия между хостом и контейнером. Я либо запускаю lsof непосредственно в контейнере, либо с хоста вхожу в пространство имён целевого процесса. Так я понимаю, почему порт в контейнере находится в состоянии LISTEN, а на хосте выглядит „свободным“: они находятся в разных пространствах имён. Аналогичным образом я поступаю с пространствами имён монтирования: привязанные монтирования и накладные файловые системы отображаются в столбце NAME с их реальными путями и помогают находить неправильно настроенные тома. Кроме того, я сортирую открытые дескрипторы по пользователям и Cgroup, если управляю сервисами с помощью супервизоров или решений для оркестрации.

Анализ сети с помощью команды lsof -i

С lsof -i я отслеживаю активные соединения и прослушиваю занятые Порты. Фильтры, такие как lsof -iTCP -sTCP:LISTEN целенаправленно прослушивает службы, находящиеся в состоянии LISTEN. Для отдельных протоколов я использую lsof -iUDP или определённых портов, таких как lsof -i:25 для почтовых серверов. Кроме того, я проверяю, не держит ли PID открытыми несколько сокетов, что может свидетельствовать об утечках или бесконечных циклах. При проверке безопасности я сравниваю ожидаемые службы с результатами вывода и выявляю посторонние или забытые Услуги. Такой обзор сети позволяет сэкономить время, так как мне не нужно одновременно запрашивать данные из нескольких инструментов, а вся информация отображается в одном месте.

Углубленное изучение сведений о сети

Для особо целенаправленных запросов я использую синтаксис адресов и портов из -i: Я ограничиваю поиск исходными или целевыми адресами (lsof [email protected]) или укажи адрес и порт (lsof [email protected]:443). С -sTCP:ESTABLISHED я вижу продуктивные сессии, в то время как -sTCP:LISTEN выводит только прослушиватели. Анализ UDP я использую для выявления служб с большим количеством кратковременных сокетов (DNS, Syslog, NTP). Кроме того, я проверяю, не подвергаются ли процессы излишнему риску в сети (например, прослушиватели на 0.0.0.0 (вместо локального интерфейса). Это позволяет сократить объем работ по укреплению безопасности на более поздних этапах.

Обзор таблицы: часто используемые параметры

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

Вариант Назначение Пример
-i Отобразить сетевые подключения и занятые порты lsof -i:443
-c ИМЯ Фильтрация по названиям процессов (соответствие префикса) lsof -c nginx
-p PID Все открытые файлы с данным PID lsof -p 1234
-u ПОЛЬЗОВАТЕЛЬ Открытые ресурсы пользователя lsof -u mysql
+d DIR Только указанный каталог lsof +d /var/log
+D DIR Рекурсивный обход каталога lsof +D /var/log
-nP Без поиска DNS и имен портов (быстрее) lsof -nP -i
-t Выводить только PID (удобно для скриптов) lsof -t -i:80
+L1 Показать удаленные, но все еще открытые файлы lsof +L1

Я использую -t часто используется для прямой передачи PID в скрипты, например, в kill или systemctl. С +L1 я нахожу процессы, которые продолжают удерживать удаленные файлы в открытом состоянии и тем самым занимают место на диске. В сочетании с -r (повторяю) я наблюдаю изменения в течение короткого расстояния. Проводя тестирование поэтапно, можно избежать ошибочных интерпретаций и обеспечить последовательность в работе. Таким образом, диагноз остается воспроизводимым и поддающимся оценке очистить.

Эффективная дальнейшая обработка вывода

Я сразу же форматирую вывод, чтобы быстрее получить результаты использовать. С lsof -t -i:80 | xargs -r kill -TERM я, например, завершаю все процессы, использующие порт 80. Для отчетов я использую lsof -nP -i | grep LISTEN вернуться и целенаправленно отфильтровать состояния. Также awk помогает: lsof -nP | awk '{print $1,$2,$3,$9}' ограничивает отображение до имени, PID, пользователя и пути. Я документирую работающие однострочные команды, чтобы позже не пришлось Поиск по подходящим образцам. Такие маленькие помощники, как watch 'lsof -nP -i:443' отражают изменения в режиме реального времени и помогают быстрее принять решение.

Автоматизация и вывод данных, пригодных для синтаксического анализа

Для повторяющихся проверок я использую машиночитаемый формат lsof с -F. Я выбираю только те поля, которые мне нужны (например, «Процесс», «Команда», «Пользователь», «FD», «Имя»), и продолжаю их стабильно анализировать. Примеры:

  • lsof -Fn -Fp -Fc -Fu -t -i:443 – минималистичные поля для скриптов, которым требуются только PID или имена.
  • lsof -Fpcun -a -iTCP -sTCP:LISTEN – Сбор данных о слушателях и их целенаправленная обработка.

С -r 2 я создаю „живой“ снимок каждые две секунды и сравниваю снимки. В конвейерах я объединяю изменения (сортировать, uniq, diff), чтобы обнаруживать появление или исчезновение дескрипторов. Я специально предусматриваю таймауты, чтобы запросы не зависали при высокой нагрузке, а задания мониторинга корректно завершались.

Передовой опыт и вопросы безопасности

Я запускаю анализы с минимальными правами и повышаю их только в том случае, если корневой, если у меня нет необходимых прав доступа. Так я снижаю риски и обеспечиваю четкость журналов. Я проверяю регулярные сканирования с помощью lsof -i в отличие от тех сервисов, которые я обычно использую для обнаружения необычных слушателей или подключений. Затем я целенаправленно проверяю подозрительные PID, анализируя файлы, библиотеки и Розетки. Во время окон технического обслуживания я слежу за тем, чтобы удаленные, но все еще открытые файлы не занимали место. Те, кто серьезно относится к безопасности, включают lsof в контрольные списки и реагируют на аномалии с помощью заранее определенных Шаги.

Распространенные проблемы и эффективные решения

  • Не все записи отображаются: Без прав root мне часто не хватает процессов других пользователей или дескрипторов, связанных с ядром. Я целенаправленно использую судо.
  • Медленная выдача: Я отключаю разрешения с помощью -nP, отказаться от рекурсии и ограничить с помощью -a сильно.
  • +D слишком дорого: Рекурсивный обход каталогов может занимать очень много времени. Я начну с +d или конкретные пути и расширяю их только по мере необходимости.
  • Порт занят, процесс неясен: Я сочетаю lsof -i: -nP с -t для PID и перейдите к lsof -p глубже.
  • „Не хватает “свободного» места: lsof +L1 находит открытые, но удаленные файлы. После этого целенаправленно перезапустите или завершите процесс.
  • Контейнеры/пространства имён: Я проверяю запрос в соответствующем пространстве имён, иначе могу увидеть неверные прослушиватели или пропустить открытые файлы.

Понимание эффективности и ограничений

На очень крупных системах полная запись с помощью lsof занимает много времени и приводит к заметным Загрузить. Поэтому я включаю фильтры на ранних этапах и переключаюсь с помощью -nP все разрешения. При большом количестве ручек я параллельно проверяю Ограничения на количество файловых дескрипторов и, при необходимости, обновите их. В скриптах следует предусматривать таймауты и использовать -t передаю только PID, чтобы сократить объем данных. Я фиксирую исключения и встраиваю повторяющиеся проверки в автоматизированные процессы. Таким образом, диагностика остается надежной и понятной даже при высокой нагрузке управляемый.

Практический рабочий процесс: от симптома к причине

Начну с вопроса: речь идет о файле, процессе или Порт? После этого я выбираю подходящее вступление, например lsof /путь/к/файлу, lsof -p или lsof -i:. Я проверяю USER, FD, TYPE и NAME и фиксирую, что выглядит ожидаемо, а что удивляет. Затем принимаю меры: перезапускаю процесс, корректирую конфигурацию, снимаю ограничение или открываю порт. В случае неопределённости я фиксирую текущее состояние, сохраняю журналы и повторяю измерение после внесения изменений. Такой подход помогает мне сохранять концентрацию и обеспечивает чёткий Цепочка доказательств.

Список: быстрые рецепты на каждый день

  • Кто блокирует файл? lsof /путь/к/файлу – Считать PID, целенаправленно перезапустить или завершить процесс.
  • Какая служба занимает этот порт? lsof -nP -i: – Устранить конфликт, изменить порт или адрес привязки.
  • Куда исчезает место для парковки? lsof +L1 – найти открытые и удаленные файлы, перезапустить соответствующие PID.
  • Процесс завис из-за операций ввода-вывода? lsof -p – обращайте внимание на каналы, сокеты или файлы; при необходимости дополняйте с помощью strace.
  • Какие листеры действительно работают? lsof -nP -iTCP -sTCP:LISTEN – сверить со списком ожиданий.
  • Какие ресурсы использует служебная учетная запись? lsof -u – Выявление отклонений по каждому аккаунту.

Краткое руководство для повседневной жизни

lsof показывает, кто блокирует какой файл, какой каталог или какой порт. С помощью -c, -p, -u, +d/+D и -i Я быстро сужаю круг поиска. Я разблокирую заблокированные файлы, выявляю конфликты портов и обнаруживаю необычные Соединения. В сочетании с -nP Я работаю оперативно и слежу за тем, чтобы объем вывода оставался понятным. Для более глубокого анализа я использую дополнительные инструменты, документирую работающие однострочные команды и встраиваю повторяющиеся проверки в автоматизированные процессы. Таким образом, диагностика с помощью lsof остается прямой, надежной и поддающейся оценке эффективно.

Текущие статьи

Фотореалистичное изображение хостинг-сервера с равномерным распределением нагрузки на процессор
Серверы и виртуальные машины

Планировщик ядра CFS: как работает справедливое планирование на хостинг-серверах

Объяснение принципа работы CFS Scheduler: справедливое планирование в ядре Linux для хостинг-серверов, производительность и оптимальное распределение нагрузки на ЦП.