Вы когда-нибудь пытались отмонтировать USB-накопитель и получали ошибку «Устройство или ресурс занят» (Device or Resource Busy)? Эта распространенная проблема возникает, когда процесс все еще использует файл или каталог на устройстве. Чтобы решить эту проблему, вам нужно выяснить, какой процесс удерживает ресурс. Двумя мощными утилитами для этой задачи являются lsof и fuser.
Использование lsof для вывода списка открытых файлов
В Linux почти все рассматривается как файл, включая диски, каналы, сетевые сокеты и устройства. Команда lsof (сокращение от «list open files» — список открытых файлов) показывает подробный список всех открытых файлов и процессов, которые их используют.
Чтобы увидеть, какие процессы используют текущий каталог (.), вы можете выполнить:
pete@icebox:~$ lsof .
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lxsession 1491 pete cwd DIR 8,6 4096 131 .
update-no 1796 pete cwd DIR 8,6 4096 131 .
nm-applet 1804 pete cwd DIR 8,6 4096 131 .
xterm 2205 pete cwd DIR 8,6 4096 131 .
bash 2207 pete cwd DIR 8,6 4096 131 .
lsof 5914 pete cwd DIR 8,6 4096 131 .
Вывод показывает команду (COMMAND), идентификатор процесса (PID) и пользователя (USER), связанного с каждым открытым файлом. Имея эту информацию, вы можете определить процессы, которые мешают вам отмонтировать устройство.
Команда fuser
Еще одним отличным инструментом является команда fuser (сокращение от «file user» — пользователь файла). Эта утилита определяет, какие процессы используют определенные файлы, сокеты или файловые системы. Команда linux fuser — это быстрый способ увидеть PID процессов, обращающихся к конкретному ресурсу.
Использование опции -v (подробный режим) дает более подробный вывод:
pete@icebox:~$ fuser -v .
USER PID ACCESS COMMAND
/home/pete: pete 1491 ..c.. lxsession
pete 1796 ..c.. update-notifier
pete 1804 ..c.. nm-applet
pete 2205 ..c.. xterm
pete 2207 ..c.. bash
Здесь мы можем четко видеть, какие процессы используют наш текущий каталог. Столбец ACCESS показывает, как используется файл (например, c для текущего каталога).
Завершение процессов с помощью fuser
Ключевой особенностью команды fuser является ее способность завершать процессы, использующие ресурс. Опция fuser -k отправляет сигнал SIGKILL каждому процессу, обращающемуся к указанному файлу или файловой системе. Это особенно полезно для отмонтирования занятого устройства.
Например, чтобы завершить все процессы, использующие точку монтирования /mnt/usb, вы бы выполнили:
sudo fuser -k /mnt/usb
Использование fuser -k в Linux — это быстрый и эффективный способ освободить ресурс.
fuser против lsof
Итак, когда следует использовать fuser против lsof?
lsofотлично подходит для детального исследования. Он предоставляет обширную информацию обо всех открытых файлах, что делает его идеальным для сложной отладки.fuserболее прямолинеен. Он идеально подходит для быстрого определения и, при необходимости, завершения процессов, работающих с определенным файлом или точкой монтирования. Командаfuser commandчасто является более быстрым выбором для устранения ошибок «Устройство или ресурс занят».
Оба инструмента необходимы любому пользователю Linux. Ознакомьтесь с ними, чтобы эффективно управлять файлами и процессами.