Что означает ошибка ETXTBSY
Ошибка ETXTBSY (часто отображается как Text file busy или Device or resource busy) возникает в Linux, когда вы пытаетесь выполнить операцию с файлом (удалить, изменить, переименовать), но система обнаруживает, что этот файл в данный момент используется активным процессом. Это защитный механизм ядра, предотвращающий повреждение данных или несогласованное состояние.
Типичные сценарии появления:
- Попытка удалить или перезаписать исполняемый файл (
.exe, бинарник), который в данный момент запущен. - Файл открыт в программе (текстовом редакторе, IDE, антивирусе) с блокировкой на запись.
- Файл расположен на сетевой файловой системе (NFS) и заблокирован удалённым процессом.
Симптом: команда rm, mv, vim или другая завершается с сообщением Text file busy или Resource temporarily unavailable.
Причины возникновения
- Исполняемый файл запущен
Вы пытаетесь удалить или перезаписать бинарный файл или скрипт, который в данный момент выполняется ядром как процесс. Linux не позволяет изменять исполняемые файлы во время их выполнения. - Файл открыт другим процессом с эксклюзивной блокировкой
Некоторые приложения (например, базы данных, редакторы) могут открывать файлы в режиме, запрещающем другие процессы читать или писать в них. - Сетевая файловая система (NFS) блокирует файл
При использовании NFS удалённый клиент или сервер может удерживать блокировку на файле, что приводит к локальной ошибкеETXTBSY. - Файл используется как разделяемая библиотека
Хотя разделяемые библиотеки (.so) обычно могут быть перезаписаны, в редких случаях (например, при активной загрузке в память) ядро может временно блокировать их. - Антивирус или система мониторинга
Демоны вродеclamdилиauditdмогут сканировать файл и временно блокировать его для анализа.
Способы решения
Способ 1: Использование lsof для поиска и ручного завершения процесса
lsof (list open files) — утилита, которая показывает, какие процессы используют указанный файл.
- Установите
lsof, если его нет:# Для Ubuntu/Debian sudo apt update && sudo apt install lsof # Для CentOS/RHEL/Fedora sudo yum install lsof # или dnf install lsof - Найдите процесс, удерживающий файл:
lsof /путь/к/файлу
Пример вывода:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME vim 1234 user txt REG 8,1 10240 12345 /home/user/script.sh
ЗдесьPID(Process ID) —1234. - Завершите процесс:
kill 1234
Если процесс не реагирует на обычный сигнал, используйте принудительное завершение:kill -9 1234 - Повторите операцию с файлом (удаление, редактирование и т.д.).
⚠️ Важно: Не завершайте системные процессы (например,
systemd,sshd) без понимания последствий. Убедитесь, что PID принадлежит именно тому приложению, которое работает с вашим файлом.
Способ 2: Использование fuser для быстрого завершения
fuser — более агрессивная утилита, которая может сразу завершить все процессы, использующие файл.
- Установите
fuser(обычно входит в пакетpsmisc):sudo apt install psmisc # Ubuntu/Debian sudo yum install psmisc # CentOS/RHEL - Просмотрите процессы (опционально):
fuser -v /путь/к/файлу - Завершите процессы автоматически:
sudo fuser -k /путь/к/файлу
Ключ-kотправляет сигналSIGKILLвсем процессам, использующим файл. Для более мягкого подхода используйте-TERM(по умолчанию):sudo fuser -TERM /путь/к/файлу - Проверьте, что файл освобождён, и повторите операцию.
Способ 3: Работа с NFS и сетевыми файловыми системами
Если файл находится на NFS-шаре, локальные команды lsof/fuser могут не увидеть удалённый процесс. Действия:
- На клиенте (где возникает ошибка) найдите PID:
fuser -k /mnt/nfs/файл - Если не помогает, переподключите NFS-шару:
sudo umount /mnt/nfs sudo mount -t nfs сервер:/экспорт /mnt/nfs
Или принудительно перемонтируйте (если поддерживается):sudo mount -o remount /mnt/nfs - На сервере NFS проверьте, не держит ли файл какой-либо процесс:
lsof /экспорт/файл
И завершите его.
Способ 4: Ожидание освобождения файла
Иногда файл блокируется на короткое время (например, при записи логов или кэшировании). Если процесс завершится сам:
- Подождите несколько секунд и повторите операцию.
- Используйте цикл ожидания (для скриптов):
while lsof /путь/к/файлу >/dev/null; do sleep 1; done echo "Файл освобождён"
Способ 5: Перезагрузка системы (крайний случай)
Если ни один из способов не сработал, а файл критически важен и не может ждать, перезагрузите компьютер. Это гарантированно освободит все ресурсы.
sudo reboot
💡 Совет: После перезагрузки проверьте, не запускается ли процесс, блокирующий файл, автоматически (через systemd, cron). Отключите его, если нужно.
Профилактика
Чтобы избежать ошибки ETXTBSY в будущем:
- Закрывайте файлы после использования — не оставляйте открытыми в редакторах или других программах.
- Не запускайте один и тот же исполняемый файл несколько раз одновременно, если он не предназначен для этого (например, через
systemdилиcron). - Используйте lock-файлы в скриптах и приложениях для координации доступа к ресурсам.
- При обновлении бинарных файлов останавливайте связанные сервисы:
sudo systemctl stop имя_сервиса # Замените файл sudo systemctl start имя_сервиса - Для NFS настройте параметры монтирования с опцией
noac(no attribute caching) илиactimeo=0, если блокировки возникают часто.
Заключение
Ошибка ETXTBSY — это сигнал о том, что файл временно недоступен из-за активности процесса. С помощью утилит lsof и fuser вы можете быстро идентифицировать и устранить блокировку. В большинстве случаев достаточно одного из первых двух способов. Помните о безопасности: завершайте только те процессы, которые точно не являются системными критическими.