Device or resource busy при операции с файлом
Сообщение Device or resource busy (номер 16, EBUSY) означает, что объект используется: точка монтирования занята, устройство открыто, файл держит процесс. Разбор всегда сводится к поиску того, кто держит.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Точку монтирования держит процесс
Открытый файл или рабочий каталог внутри точки не дают её отмонтировать.
-
Устройство открыто другой программой
Последовательный порт, устройство захвата, диск — всё это открывается монопольно. Вторая программа получает отказ.
-
Файл заменяется во время использования
Замена файла базы или образа, который открыт процессом, даёт отказ. Это защита от порчи данных.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Процессы, держащие путь.
sudo fuser -vm /путь 2>&1 | headОткрытые файлы по этому пути.
sudo lsof /путь 2>/dev/null | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Открытый файл или рабочий каталог внутри точки не дают её отмонтировать.
- Как проверить
-
Найдите держащие процессы.
sudo fuser -vm /mnt/data 2>&1 | head sudo lsof +f -- /mnt/data 2>/dev/null | head
- Как исправить
- Выйдите из каталога, остановите службу и повторите. Принудительное отмонтирование — крайняя мера: данные могут не успеть записаться.
- Почему происходит
- Последовательный порт, устройство захвата, диск — всё это открывается монопольно. Вторая программа получает отказ.
- Как проверить
-
Посмотрите, кто держит устройство.
sudo fuser -v /dev/ttyUSB0 2>&1 | head
- Как исправить
- Остановите программу, которая держит устройство. Для служб полезно объявить конфликт, чтобы они не запускались одновременно.
- Почему происходит
- Замена файла базы или образа, который открыт процессом, даёт отказ. Это защита от порчи данных.
- Как проверить
-
Посмотрите, кто держит файл.
sudo fuser -v /var/lib/myapp/data.db 2>&1 | head
- Как исправить
- Остановите службу перед заменой её файлов. Для программ это делается через выкладку рядом и переименование.
Пример вывода
Точка монтирования занята процессом. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
umount[4300]: umount: /mnt/data: target is busy.
$ sudo fuser -vm /mnt/data
USER PID ACCESS COMMAND
/mnt/data: app 1200 ..c-- myapp
Связанные ошибки
- Target is busy: точка монтирования занята Не удаётся отмонтировать: target is busy. Как найти процессы, которые держат точку монтирования, и корректно освободить её.
- Text file busy при обновлении программы Ошибка 26 при записи в исполняемый файл: он выполняется прямо сейчас. Как правильно обновлять программы служб.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Argument list too long в службе или скрипте Список аргументов слишком длинный: подстановка имён файлов дала тысячи аргументов. Как переписать вызов.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Bad file descriptor в журнале службы Ошибка 9 при операции с файлом: дескриптор закрыт или не тот. Разбор для служб и сокет-активации.
- Could not open file и cannot open shared object file Программа не может открыть файл или библиотеку: путь, права, отсутствующая зависимость сборки, изоляция.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
Источники
- umount(8): ошибка EBUSY
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено процессом с открытым файлом на точке монтирования.