Файловая система может оставаться занятой, потому что процесс открыл файл, отобразил файл в память или использует каталог как текущий рабочий. lsof и fuser помогают определить такие связи. Сначала исследуйте ситуацию; остановка процессов — отдельное решение с эксплуатационными последствиями.
Использование процессов · Урок 2
lsof и fuser
Узнайте, как определять процессы, использующие файлы, каталоги, точки подключения и сетевые сокеты.
Перечисление открытых файлов через lsof
lsof означает «list open files» — перечислить открытые файлы. Запросите путь, чтобы увидеть соответствующие записи:
$ sudo lsof -- /mnt/usb
Для целого дерева каталогов в одной файловой системе реализации обычно поддерживают +D, но рекурсивное сканирование может быть затратным:
$ sudo lsof +D /mnt/usb
К полезным столбцам относятся COMMAND, PID, USER, файловый дескриптор (FD), тип, устройство и NAME. Метка cwd в столбце FD означает, что процесс использует каталог как текущий рабочий. Непривилегированный вывод может быть неполным для процессов других пользователей.
Что означает cwd в столбце FD?
Определение пользователей через fuser
fuser сообщает идентификаторы процессов, использующих указанный файл или файловую систему. Подробный вывод добавляет пользователей, виды доступа и имена команд:
$ sudo fuser -v /mnt/usb
Чтобы рассматривать аргумент как подключённую файловую систему и найти процессы, обращающиеся к файлам внутри неё, используйте параметр подключения, поддерживаемый fuser из procps:
$ sudo fuser -vm /mnt/usb
Убедитесь, что путь является требуемой точкой подключения, например через findmnt --target /mnt/usb. Bind-подключения, пространства имён, права и состояния гонки могут влиять на сведения одного запроса.
Зачем использовать fuser -v вместо простого fuser при исследовании?
Работа с занятой файловой системой
Используйте осознанную последовательность вместо немедленного завершения каждого совпавшего PID:
- Подтвердите хост, путь, источник подключения и запланированное обслуживание.
- По возможности найдите процессы обоими инструментами.
- Определите, можно ли остановить каждый процесс, вывести его из каталога или дать ему завершиться.
- При наличии используйте диспетчер служб или интерфейс приложения для остановки.
- Повторите запрос, затем отключите файловую систему и проверьте результат.
fuser -k отправляет сигнал совпавшим процессам. В распространённых реализациях procps по умолчанию это SIGKILL, поэтому нормальное завершение не выполняется. Если явно одобренное завершение необходимо, выберите подходящий сигнал, проверьте PID и владельца и учтите, что набор процессов может измениться между проверкой и действием.
Почему fuser -k /mnt/usb — плохой первый шаг диагностики?
Выбор инструмента
Используйте lsof, когда нужен подробный список открытых файлов, дескрипторов или сокетов. Используйте fuser для ориентированного на путь представления совпавших PID и видов доступа. Ни один результат сам по себе не говорит, безопасно ли завершать процесс.
Для сетевых сокетов укажите явное пространство протокола в fuser или примените специализированный инструмент вроде ss:
$ sudo fuser -v 22/tcp
$ sudo ss -lntp
Какой инструмент подходит для подробного списка открытых файловых дескрипторов и процессов-владельцев?
Урок завершён
Вы завершили lsof и fuser
Теперь вы можете исследовать использование файлов и файловых систем, не считая завершение процесса действием по умолчанию.
Используйте
lsofдля подробных записей открытых файлов.Используйте
fuserдля сведений о PID и доступе, ориентированных на путь.Подтверждайте подключение и учитывайте права и состояния гонки.
Координируйте нормальную остановку до рассмотрения сигнала.
Повторяйте запрос и проверяйте результат отключения или работы службы.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт