Какая операция вызывает ошибку «текстовый файл занят»? Я не могу сказать точно.
Я думаю, это связано с тем, что я создаю временный скрипт python (используя tempfile) и использую из него execl, но я думаю, что execl изменяет запускаемый файл.
Эта ошибка означает, что к вашему файлу обращается какой-то другой процесс или пользователь. Используйте, lsof
чтобы проверить, какие другие процессы его используют. При необходимости вы можете использовать kill
команду, чтобы убить его.
Text file busy
ошибка связана с попыткой изменить исполняемый файл во время его выполнения. «Текст» здесь относится к тому факту, что изменяемый файл является текстовым сегментом для запущенной программы. Это очень частный случай, а не тот общий, который, кажется, предполагает ваш ответ. Тем не менее, ваш ответ не совсем неверен.Я давно не видел этого сообщения, но раньше оно было преобладающим в System V R3 или около того, пару десятилетий назад. Тогда это означало, что вы не могли изменить исполняемый файл программы во время ее работы.
Например, я создавал
make
подобную работу под названиемrmk
, и через некоторое время она стала самоподдерживающейся. Я бы запустил версию для разработки и заставил ее построить новую версию. Чтобы заставить его работать, нужно было использовать обходной путь:Итак, чтобы избежать проблем с «занятым текстовым файлом», сборка создала новый файл
rmk1
, затем переместила старыйrmk
вrmk2
(переименование не было проблемой; разорвать связь было), а затем переместила вновь созданный файлrmk1
вrmk
.Я давно не видел ошибки в современной системе ... но у меня не так уж часто программы перестраиваются сами.
источник
echo -e '#include <unistd.h>\nint main(void){sleep (5);return 0;}' > slowprog.c && cc slowprog.c && cp a.out b.out && (./a.out &) ; sleep 1 && cp b.out a.out
. Выдало сообщение об ошибке «cp: невозможно создать обычный файл 'a.out': текстовый файл занят» в моей новой Fedora.unlink
по умолчанию.Источник: http://wiki.wlug.org.nz/ETXTBSY
источник
Минимальный пример воспроизведения POSIX на C
Я рекомендую разобраться в базовом API, чтобы лучше понять, что происходит.
sleep.c
busy.c
Скомпилируйте и запустите:
busy.out
передает утверждения иperror
выводит:Таким образом, мы делаем вывод, что сообщение жестко закодировано в самой glibc.
В качестве альтернативы:
выводит Bash:
Для более сложных приложений вы также можете наблюдать это с помощью
strace
:который содержит:
Проверено на Ubuntu 18.04, ядро Linux 4.15.0.
Ошибка не возникает, если вы
unlink
сначалаnotbusy.c:
Затем скомпилируйте и запустите аналогично предыдущему, и эти утверждения пройдут.
Это объясняет, почему он работает с некоторыми программами, но не работает с другими. Например, если вы это сделаете:
это не вызывает ошибки, даже если второй
gcc
вызов выполняет записьsleep.out
.Быстро
strace
показывает, что GCC сначала отключается перед записью:содержит:
Причина, по которой он не терпит неудачу, заключается в том, что когда вы
unlink
и перезаписываете файл, он создает новый индексный дескриптор и сохраняет временный висячий индексный дескриптор для запущенного исполняемого файла.Но если у вас просто
write
нетunlink
, тогда он пытается записать в тот же защищенный индекс, что и запущенный исполняемый файл.POSIX 7
open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
человек 2 открытый
источник
unlink
. Считывает ли Linux когда-либо файл более одного раза после первогоexec
вызова?В моем случае я пытался запустить файл оболочки (с расширением .sh) в среде csh и получал это сообщение об ошибке.
просто работая с bash, это сработало для меня. Например
источник
#!/bin/bash
заголовок?#!/usr/bin/csh
или аналог.Если вы пытаетесь создать систему
phpredis
на Linux, вам может потребоваться время, чтобы завершить изменение прав доступа к файлу с помощьюsleep
команды, прежде чем запускать файл:источник
chmod
что вернусь до того, как будут установлены разрешения. Это может быть проблема с файловой системой.Не знаю причины, но я могу помочь быстро и легко решить эту проблему.
Я только что испытал эту странность в CentOS 6 после "cat> shScript.sh" (вставить, ^ Z), а затем отредактировав файл в KWrite. Как ни странно, не было заметного экземпляра (ps -ef) выполнения скрипта.
Моей быстрой работой было просто "cp shScript.sh shScript2.sh", после чего я смог запустить shScript2.sh. Потом удалил оба. Готово!
источник
cat
процесс. В следующий раз используйте ^ D, а не ^ Z.Вы можете обнаружить, что это чаще встречается в общих сетевых папках CIFS / SMB. Windows не позволяет записывать файл, когда этот файл открыт чем-то другим, и даже если это служба, отличная от Windows (это может быть другой продукт NAS), она, скорее всего, будет воспроизводить то же поведение. Потенциально это также может быть проявлением некоторой основной проблемы NAS, нечетко связанной с блокировкой / репликацией.
источник
Если вы запускаете .sh из ssh-соединения с помощью такого инструмента, как MobaXTerm, и если в указанном инструменте есть утилита автосохранения для редактирования удаленного файла с локального компьютера, это заблокирует файл.
Ее решает закрытие и повторное открытие сеанса SSH.
источник
Один из моих опытов:
Я всегда меняю сочетание клавиш по умолчанию в Chrome с помощью обратного проектирования. После модификации я забыл закрыть Chrome и выполнил следующее:
Используя strace, вы можете найти более подробную информацию:
источник
Я столкнулся с этим в PHP при использовании
fopen()
в файле, а затем пытался сделатьunlink()
это перед использованиемfclose()
в нем.Не хорошо:
Хорошо:
источник
источник