Статьи по тематике устранение неисправностей связаны с определенным набором решений проблем. В случае с Linux и Unix полезно иметь некое руководство по доступным инструментам, облегчающим работу по поиску и устранению проблем. Это такой документ, который содержит основные важные команды, позволяющие облегчить жизнь администраторам Linux/Unix при возникновении проблем.
Команда "list open files" или команда lsof выглядит достаточно просто, но ее использование в качестве инструмента для устранения неполадок не так очевиден, как кажется на первый взгляд. Например, если у неизвестного процесса открыто несколько файлов, знание того, какие они есть, может помочь определить, является ли процесс легитимным.
В первой статье рассмотрим множество вариантов использования команды lsof.
Во второй статье рассмотрены рекомендации о том, как исправлять проблемы этим множеством вариаций данной команды.
Контрольные вопросы, которые следует задать себе при диагностике проблем, является предметом нашей третьей статьи. Это поможет навести порядок в хаосе, который создают некоторые проблемы.
Работа с базами данных Oracle - обычная задача администратора, и немного узнать о них и о том, как тестировать соединения с ними, - ценный инструмент, описанный в четвертой статье. Если проблема связана с подключением, отпадает потребность в вызове администратора баз данных.
В завершении нашего руководства приведена статья с инструкциями по командам, необходимым для управления дисками и разбиения их на разделы.
Команда lsof
Команда lsof - это нечто большее, чем вы можете себе представить. Узнайте обо всех возможностях ее применения для поиска и устранения неполадок.
lsof - команда Unix/Linux, которая отображает все открытые файлы или идентифицирует процессы, открытые конкретными файлами. Удобная для оценки безопасности ИС, а также для устранения проблем lsof предлагает широкий спектр параметров, позволяющие использовать её различными способами - иногда даже превосходя команду ps для просмотра процессов и команду netstat для исследования сетевых интерфейсов.
Что такое открытые файлы?
Для начала давайте рассмотрим, что такое открытые файлы и почему они вам могут быть интересны. Открытые файлы - это файлы, которые использует какой-либо процесс. Этот процесс может быть командой, которую вы выполняете, или приложением, запущенным на сервере, которым вы управляете. Открытые файлы могут включать файлы данных и библиотеки, которые предоставляют общие процедуры. Многие файлы открываются каждый раз, когда вы входите в систему. Вы можете быть удивлены их количеством. Если вам интересно, сколько файлов у вас открыто прямо сейчас, попробуйте эту команду:
$ lsof -u admin | wc -l 1715
И если вы когда-нибудь слышали, что для Unix все является файлом, вы, возможно, не слишком удивитесь, узнав, что lsof работает с такими вещами, как сетевые интерфейсы, которые большинство из нас обычно не считают файлами.
Почему нам это важно?
Иногда появляется необходимость узнать об открытых файлах, потому что вы пытаетесь удалить файл и обнаруживаете, что он уже используется. Может быть, он заполняет ваше дисковое пространство. Вам необходимо узнать, каким файлом какой процесс открыт, чтобы можно было остановить его и очистить файл. В других случаях вам понадобится узнать, что делает неизвестный подозрительный процесс, и только изучение файлов, которые открыл подозрительный процесс, может предоставить ценную информацию.
Принцип работы lsof?
При применении команды lsof без параметров в терминале выводятся все файлы, которые открыты (используются) в вашей системе. Если вы запустите lsof от своего имени, вы получите длинный список файлов, но выходные данные будут включать в себя множество сообщений об отказе в разрешении - многие из них представляют открытые файлы в файловой системе /proc, которые вам не разрешено видеть. Запустите команду от имени root, и вы увидите больше выходных данных.


Что еще интересного?
Беглый взгляд на довольно большой справочник lsof отобразит вам, что мы увидели только меньшую ее часть возможностей. lsof имеет обширный список опций.

В этой статье мы разберем наиболее полезные.
Чтобы начать работу со всеми этими параметрами, вам необходимо о том знать о возможности использования более одной опции. Для этого используйте слово OR. Таким образом, вы получаете список, объединяющий результаты указанных вами параметров. Помимо этого вы можете выбрать вариант, со служебным словом AND. В этом случае ваши опции будут применяться вместе. Другими словами, вы увидите те файлы, процессы и т. д., которые соответствуют всем указанным вами параметрам. Для применения объединения AND, добавьте в свою команду параметр -a.
Полезные параметры lsof
Примеры использования lsof с параметрами, отображены на скриншотах ниже. Они демонстрируют наиболее полезные вещи, которые вы можете применить с данной командой.
На скриншоте ниже lsof, перечисляет все процессы, у которых открыт конкретный файл:

На этом скриншоте выводится список всех процессов, у которых есть открытые файлы в определенном каталоге:

На этом скриншоте показаны файлы, открытые bash:

На этом скриншоте, но с использованием подстроки вместо полного имени процесса:

На этом скриншоте перечислены открытые файлы для определенного идентификатора процесса:

lsof помогает изучить сетевые подключения:

На скриншоте показан пример просмотра портов и/или установленных соединений.

Также можно сетевые подключения для одного конкретного источника.

Просмотр файлов пользователем
На этом скриншоте lsof просматриваем открытые файлы для конкретного пользователя:

Для просмотра открытых файлов всех пользователей, кроме определенного (здесь это root), используйте знак ^:

Перечислить идентификаторы процессов для процессов, запускаемых конкретным пользователем:
$ sudo lsof -t -u froggy 15352 15353
Завершить все процессы, принадлежащие конкретному пользователю:
$ sudo kill lsof -t -u froggy
Используйте параметр -a для использования оператора AND для объединения ваших опций вместе, помня, что это ограничивает вывод только тем, что соответствует всем указанным условиям:
