Linux ETXTBSYСредняя

Ошибка 'Файл занят' в Linux: причины и способы исправления

Ошибка 'Файл занят' возникает, когда процесс блокирует файл. В статье вы узнаете, как найти и завершить этот процесс, чтобы освободить файл.

Обновлено 16 февраля 2026 г.
5-10 мин
Низкая
FixPedia Team
Применимо к:Ubuntu 20.04+Debian 11+CentOS 8+Все дистрибутивы с ядром 3.x+

Что означает ошибка ETXTBSY

Ошибка ETXTBSY (часто отображается как Text file busy или Device or resource busy) возникает в Linux, когда вы пытаетесь выполнить операцию с файлом (удалить, изменить, переименовать), но система обнаруживает, что этот файл в данный момент используется активным процессом. Это защитный механизм ядра, предотвращающий повреждение данных или несогласованное состояние.

Типичные сценарии появления:

  • Попытка удалить или перезаписать исполняемый файл (.exe, бинарник), который в данный момент запущен.
  • Файл открыт в программе (текстовом редакторе, IDE, антивирусе) с блокировкой на запись.
  • Файл расположен на сетевой файловой системе (NFS) и заблокирован удалённым процессом.

Симптом: команда rm, mv, vim или другая завершается с сообщением Text file busy или Resource temporarily unavailable.

Причины возникновения

  1. Исполняемый файл запущен
    Вы пытаетесь удалить или перезаписать бинарный файл или скрипт, который в данный момент выполняется ядром как процесс. Linux не позволяет изменять исполняемые файлы во время их выполнения.
  2. Файл открыт другим процессом с эксклюзивной блокировкой
    Некоторые приложения (например, базы данных, редакторы) могут открывать файлы в режиме, запрещающем другие процессы читать или писать в них.
  3. Сетевая файловая система (NFS) блокирует файл
    При использовании NFS удалённый клиент или сервер может удерживать блокировку на файле, что приводит к локальной ошибке ETXTBSY.
  4. Файл используется как разделяемая библиотека
    Хотя разделяемые библиотеки (.so) обычно могут быть перезаписаны, в редких случаях (например, при активной загрузке в память) ядро может временно блокировать их.
  5. Антивирус или система мониторинга
    Демоны вроде clamd или auditd могут сканировать файл и временно блокировать его для анализа.

Способы решения

Способ 1: Использование lsof для поиска и ручного завершения процесса

lsof (list open files) — утилита, которая показывает, какие процессы используют указанный файл.

  1. Установите lsof, если его нет:
    # Для Ubuntu/Debian
    sudo apt update && sudo apt install lsof
    
    # Для CentOS/RHEL/Fedora
    sudo yum install lsof   # или dnf install lsof
    
  2. Найдите процесс, удерживающий файл:
    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.
  3. Завершите процесс:
    kill 1234
    

    Если процесс не реагирует на обычный сигнал, используйте принудительное завершение:
    kill -9 1234
    
  4. Повторите операцию с файлом (удаление, редактирование и т.д.).

⚠️ Важно: Не завершайте системные процессы (например, systemd, sshd) без понимания последствий. Убедитесь, что PID принадлежит именно тому приложению, которое работает с вашим файлом.

Способ 2: Использование fuser для быстрого завершения

fuser — более агрессивная утилита, которая может сразу завершить все процессы, использующие файл.

  1. Установите fuser (обычно входит в пакет psmisc):
    sudo apt install psmisc   # Ubuntu/Debian
    sudo yum install psmisc   # CentOS/RHEL
    
  2. Просмотрите процессы (опционально):
    fuser -v /путь/к/файлу
    
  3. Завершите процессы автоматически:
    sudo fuser -k /путь/к/файлу
    

    Ключ -k отправляет сигнал SIGKILL всем процессам, использующим файл. Для более мягкого подхода используйте -TERM (по умолчанию):
    sudo fuser -TERM /путь/к/файлу
    
  4. Проверьте, что файл освобождён, и повторите операцию.

Способ 3: Работа с NFS и сетевыми файловыми системами

Если файл находится на NFS-шаре, локальные команды lsof/fuser могут не увидеть удалённый процесс. Действия:

  1. На клиенте (где возникает ошибка) найдите PID:
    fuser -k /mnt/nfs/файл
    
  2. Если не помогает, переподключите NFS-шару:
    sudo umount /mnt/nfs
    sudo mount -t nfs сервер:/экспорт /mnt/nfs
    

    Или принудительно перемонтируйте (если поддерживается):
    sudo mount -o remount /mnt/nfs
    
  3. На сервере NFS проверьте, не держит ли файл какой-либо процесс:
    lsof /экспорт/файл
    

    И завершите его.

Способ 4: Ожидание освобождения файла

Иногда файл блокируется на короткое время (например, при записи логов или кэшировании). Если процесс завершится сам:

  1. Подождите несколько секунд и повторите операцию.
  2. Используйте цикл ожидания (для скриптов):
    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 вы можете быстро идентифицировать и устранить блокировку. В большинстве случаев достаточно одного из первых двух способов. Помните о безопасности: завершайте только те процессы, которые точно не являются системными критическими.

Часто задаваемые вопросы

Почему возникает ошибка 'Файл занят' в Linux?
Как найти процесс, который использует файл?
Что делать, если процесс нельзя завершить?
Можно ли автоматически убить процесс, блокирующий файл?

Полезное

Определите процесс, блокирующий файл
Завершите найденный процесс
Повторите операцию с файлом