Text file busy при обновлении программы
Сообщение Text file busy (номер 26, ETXTBSY) появляется при попытке записать в файл программы, которая сейчас выполняется. Классика при выкладке новой версии поверх работающей службы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Файл программы перезаписывается во время работы
Ядро не позволяет менять содержимое выполняющегося файла. Копирование поверх него даёт эту ошибку.
-
Файл занят другим процессом
Кто-то запустил программу вручную, и она работает в обход службы.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Кто держит файл открытым.
sudo fuser -v /путь/к/программеРаботающие процессы этой программы.
pgrep -a имя-программыРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Ядро не позволяет менять содержимое выполняющегося файла. Копирование поверх него даёт эту ошибку.
- Как проверить
-
Найдите процессы, использующие файл.
sudo fuser -v /usr/local/bin/myapp pgrep -a myapp
- Как исправить
-
Выкладывайте новую версию рядом и заменяйте файл переименованием: замена ссылки атомарна и не требует остановки. Либо останавливайте службу перед заменой.
sudo install -m 755 myapp.new /usr/local/bin/myapp.tmp && sudo mv /usr/local/bin/myapp.tmp /usr/local/bin/myapp && sudo systemctl restart myapp
- Почему происходит
- Кто-то запустил программу вручную, и она работает в обход службы.
- Как проверить
-
Посмотрите все процессы по имени и их контрольные группы.
ps -eo pid,user,cmd | grep -v grep | grep myapp systemd-cgls --no-pager | grep -B3 myapp
- Как исправить
- Завершите лишний процесс. Запускать службу вручную в обход systemd не стоит: он о таком процессе ничего не знает.
Пример вывода
Попытка заменить файл работающей службы. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo cp myapp.new /usr/local/bin/myapp
cp: cannot create regular file '/usr/local/bin/myapp': Text file busy
$ sudo fuser -v /usr/local/bin/myapp
USER PID ACCESS COMMAND
/usr/local/bin/myapp: app 1200 ....e myapp
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=203/EXEC в systemd Код 203/EXEC означает, что systemd не смог выполнить программу из ExecStart=. Разбор причин: путь, права, интерпретатор, синтаксис оболочки.
- Argument list too long в службе или скрипте Список аргументов слишком длинный: подстановка имён файлов дала тысячи аргументов. Как переписать вызов.
- Bad file descriptor в журнале службы Ошибка 9 при операции с файлом: дескриптор закрыт или не тот. Разбор для служб и сокет-активации.
- Could not open file и cannot open shared object file Программа не может открыть файл или библиотеку: путь, права, отсутствующая зависимость сборки, изоляция.
- Device or resource busy при операции с файлом Ошибка 16: файл или устройство заняты. Разбор для точек монтирования, устройств и файлов конфигурации.
- File exists при создании файла или сокета Ошибка 17: объект уже существует. Разбор для сокетов, файлов блокировки и каталогов службы.
- No such file or directory в журнале службы Служба не находит файл или каталог. Разбор: путь, момент запуска, изоляция unit-файла, символические ссылки, приватный /tmp.
Источники
- open(2): ошибка ETXTBSY
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено копированием поверх файла работающей службы.