Невозможно создать обычный файл текстовый файл занят
Какая операция вызывает ошибку «текстовый файл занят»? Я не могу сказать точно.
Я думаю, это связано с тем, что я создаю временный скрипт python (используя tempfile) и использую из него execl, но я думаю, что execl изменяет запускаемый файл.
Эта ошибка означает, что к вашему файлу обращается какой-то другой процесс или пользователь. Использовать lsof чтобы проверить, какие другие процессы его используют. Ты можешь использовать kill команда убить его, если необходимо.
Например, я строил make Workalike называется rmk , и через некоторое время он стал самоподдерживающимся. Я бы запустил версию для разработки и заставил ее построить новую версию. Чтобы заставить его работать, нужно было использовать обходной путь:
Итак, чтобы избежать проблем с «текстовый файл занят», сборка создала новый файл rmk1 , затем переместил старый rmk к rmk2 (переименование не было проблемой; разорвать связь было), а затем переместил недавно построенный rmk1 к rmk .
Я давно не видел ошибки в современной системе . но у меня не так часто программы перестраиваются сами.
Это происходит, когда вы пытаетесь выполнить запись в файл, который в данный момент выполняется ядром, или выполняете файл, который в данный момент открыт для записи.
Минимальный пример воспроизведения POSIX на C
Я рекомендую разобраться в базовом API, чтобы лучше понять, что происходит.
Скомпилируйте и запустите:
busy.out передает утверждения, и perror выходы:
Для более сложных приложений вы также можете наблюдать это с помощью strace :
Проверено на Ubuntu 18.04, ядро Linux 4.15.0.
Ошибка не возникает, если вы unlink первый
Затем скомпилируйте и запустите аналогично предыдущему, и эти утверждения пройдут.
Это объясняет, почему он работает с некоторыми программами, но не работает с другими. Например. если вы это сделаете:
это не вызывает ошибки, даже если второй gcc звонок пишет на sleep.out .
Быстрый strace показывает, что GCC сначала отключается перед записью:
Причина, по которой он не ошибается, заключается в том, что когда вы unlink и перезаписать файл, он создает новый индексный дескриптор и сохраняет временный свободный индексный дескриптор для запущенного исполняемого файла.
Но если вы просто write без unlink , затем он пытается выполнить запись в тот же защищенный индексный дескриптор, что и запущенный исполняемый файл.
POSIX 7 open()
[ETXTBSY]
Файл представляет собой файл чистой процедуры (совместно используемый текст), который выполняется и имеет значение O_WRONLY или O_RDWR.
человек 2 открытый
ETXTBSY
pathname относится к исполняемому образу, который в настоящее время выполняется, и был запрошен доступ на запись.
источник glibc
Быстрый grep на 2.30 дает:
и ручное попадание в manual/errno.texi :
- 2 Обоснование случая отсоединения заключается в том, что файл больше не доступен из этого каталога, но индексный дескриптор все еще существует с refcount> 0. Если вы повторно используете имя, это будет новый файл в новом индексном дескрипторе, тогда как если вы сначала не отключите связь, вы фактически пытаетесь записать в защищенный индексный дескриптор.
- @Penz obrigado за комментарий, Леандро. Мне также интересно, почему, наоборот, выдает ошибку, если вы пытаетесь писать без unlink . Читает ли Linux когда-либо файл более одного раза после первого exec вызов?
- Что генерирует ETXTBSY, так это защита inode. Без отмены связи любые записи идут в индексный дескриптор, защищенный выполнением файла; с unlink вы получаете новый inode, который не защищен. (не уверен, что термин "защищенный" здесь, но идея в этом)
просто работая с bash, это сработало для меня. Например
Если вы пытаетесь построить phpredis на компьютере с Linux вам может потребоваться время, чтобы завершить изменение прав доступа к файлам, sleep перед запуском файла:
- Я не думаю chmod вернется до того, как будут установлены разрешения. Это может быть проблема с файловой системой.
- Это произошло внутри создаваемого образа Docker.
- 1 Docker имеет несколько драйверов хранения, я думаю, не все из них идеальны.
- Тем не менее, это очень хороший совет для людей, которые сталкиваются с этой проблемой при создании образа докера.
Вы можете обнаружить, что это более распространено в сетевых папках CIFS / SMB. Windows не позволяет записывать файл, когда этот файл открыт чем-то еще, и даже если это служба, отличная от Windows (это может быть другой продукт NAS), она, скорее всего, будет воспроизводить то же поведение. Возможно, это также может быть проявлением некоторой основной проблемы NAS, которая нечетко связана с блокировкой / репликацией.
Если вы запускаете .sh из ssh-соединения с помощью такого инструмента, как MobaXTerm, и если в указанном инструменте есть утилита автосохранения для редактирования удаленного файла с локального компьютера, это заблокирует файл.
Ее решает закрытие и повторное открытие сеанса SSH.
Не знаю причины, но я могу помочь быстро и легко решить эту проблему.
Я только что испытал эту странность на CentOS 6 после того, как cat > shScript.sh (вставить, ^Z ) затем редактируем файл в KWrite. Как ни странно, заметного экземпляра не было ( ps -ef ) выполнения скрипта.
Моя быстрая работа заключалась в том, чтобы cp shScript.sh shScript2.sh тогда я смог выполнить shScript2.sh . Потом удалил оба. Выполнено!
- 1 Ваша проблема была в том, что вы приостановлено то cat процесс. В следующий раз используйте ^ D, а не ^ Z.
- Совершенно верно Владимир. Благодарность! Это то, что я сделал бы в командной строке DOS / CMD. Старых привычек . с тех пор не было :)
Один из моих опытов:
Я всегда меняю сочетание клавиш по умолчанию в Chrome с помощью обратного проектирования. После модификации я забыл закрыть Chrome и выполнил следующее:
Используя strace, вы можете найти более подробную информацию:
Я столкнулся с этим в PHP при использовании fopen() в файле, а затем пытается unlink() это перед использованием fclose() в теме.
Какая операция вызывает ошибку «текстовый файл занят»? Я не могу сказать точно.
Я думаю, это связано с тем, что я создаю временный скрипт python (используя tempfile) и использую из него execl, но я думаю, что execl изменяет запускаемый файл.
Эта ошибка означает, что к вашему файлу обращается какой-то другой процесс или пользователь. Используйте, lsof чтобы проверить, какие другие процессы его используют. При необходимости вы можете использовать kill команду, чтобы убить его.
В частности, Text file busy ошибка связана с попыткой изменить исполняемый файл во время его выполнения. «Текст» здесь относится к тому факту, что изменяемый файл является текстовым сегментом для запущенной программы. Это очень частный случай, а не тот общий, который, кажется, предполагает ваш ответ. Тем не менее, ваш ответ не совсем неверен.
Я думаю, что тот факт, что unix предполагает, что файлы являются «текстовыми файлами», нелогичен, в моем случае это был двоичный файл, который вызвал эту ошибку.
Например, я создавал make подобную работу под названием rmk , и через некоторое время она стала самоподдерживающейся. Я бы запустил версию для разработки и заставил ее построить новую версию. Чтобы заставить его работать, нужно было использовать обходной путь:
Итак, чтобы избежать проблем с «занятым текстовым файлом», сборка создала новый файл rmk1 , затем переместила старый rmk в rmk2 (переименование не было проблемой; разорвать связь было), а затем переместила вновь созданный файл rmk1 в rmk .
Я давно не видел ошибки в современной системе . но у меня не так уж часто программы перестраиваются сами.
Конечно, этот ответ правильный и получает +1. Возможно, вы захотите удалить заявление об отказе от ответственности "Это было давно".
Это происходит, когда вы пытаетесь выполнить запись в файл, который в данный момент выполняется ядром, или выполняете файл, который в данный момент открыт для записи.
Минимальный пример воспроизведения POSIX на C
Я рекомендую разобраться в базовом API, чтобы лучше понять, что происходит.
Скомпилируйте и запустите:
busy.out передает утверждения и perror выводит:
В качестве альтернативы:
Для более сложных приложений вы также можете наблюдать это с помощью strace :
Проверено на Ubuntu 18.04, ядро Linux 4.15.0.
Ошибка не возникает, если вы unlink сначала
Затем скомпилируйте и запустите аналогично предыдущему, и эти утверждения пройдут.
Это объясняет, почему он работает с некоторыми программами, но не работает с другими. Например, если вы это сделаете:
это не вызывает ошибки, даже если второй gcc вызов выполняет запись sleep.out .
Быстро strace показывает, что GCC сначала отключается перед записью:
Причина, по которой он не терпит неудачу, заключается в том, что когда вы unlink и перезаписываете файл, он создает новый индексный дескриптор и сохраняет временный висячий индексный дескриптор для запущенного исполняемого файла.
Но если у вас просто write нет unlink , тогда он пытается записать в тот же защищенный индекс, что и запущенный исполняемый файл.
POSIX 7 open()
[ETXTBSY]
Файл представляет собой файл чистой процедуры (общий текст), который выполняется и имеет значение O_WRONLY или O_RDWR.
человек 2 открытый
ETXTBSY
pathname относится к исполняемому образу, который в настоящее время выполняется, и был запрошен доступ на запись.
Обоснование случая отсоединения заключается в том, что файл больше не доступен из этого каталога, но индексный дескриптор все еще существует с refcount> 0. Если вы повторно используете имя, это будет новый файл в новом индексном дескрипторе, тогда как если вы не отсоединяете сначала, вы фактически пытаетесь записать в защищенный индексный дескриптор.
@Penz obrigado за комментарий, Леандро. Мне также интересно, почему, наоборот, выдает ошибку, если вы пытаетесь писать без него unlink . Считывает ли Linux когда-либо файл более одного раза после первого exec вызова?
Что генерирует ETXTBSY, так это защита inode. Без отсоединения все записи идут в индексный дескриптор, защищенный выполнением файла; с unlink вы получаете новый inode, который не защищен. (не уверен, что «защищенный» - это термин здесь, но идея именно в этом)
Заметил что в генте отлично сделано обновление программ. Файлы замещаются, а работающая в тот момент программа никак от этого не страдает.
Как это сделано??
Ведь, просто так, попытавшись заменить файл получаем ошибку:
cp: невозможно создать обычный файл «/usr/local/bin/progname»: Текстовый файл занят
А через:
install -m 755 -p «progname» «/usr/local/bin/progname»
Всё работает отлично.
В чём же всётаки разница в этих программах?
И как реализовать подобное на qt? Интересует прежде всего кроссплатформенная реализация.
> Интересует прежде всего кроссплатформенная реализация.
Под оффтопиком ты такого не реализуешь.
Вот тебе разница между cp и install:
в винде запущенный exe файл будет занят
я реализовывал так. делал программу стартер, которая запускала файл например qstarter запускала qtbase, если находила qtbase-new писала что есть обновление и если че перезапускала программу подменяя qtbase на qtbase-new.
что не мешает его переименовать, но подчищать всё равно придётся, конечно
в винде инсталлер просит сначала закрыть прогу, потом ставить поверх
>Файлы замещаются, а работающая в тот момент программа никак от этого не страдает.
Мы делали так: после закрытия программы запускалась хератень, которая перетаскивала ранее скаченные файлы на место
вот я примерно так и хотел сделать. вот только под виндой подразумевалось что обновлятор будет тоже написан на qt и использовать либы основной проги, которые находятся в той же директории.
а вчера до меня вдруг дошло.. либы то тоже будут залочены при запуске обновлятора! и он не сможет их обновить..
тут уж думаю выносить обновлятор в отдельную директорию вместе с либами его, чтобы можно было спокойно обновлять все файлы главной проги.
или же писать вспомогательный скрипт, который заменит файлы а потом запустит обновлятор.
под линухой всё гораздо проще. либы все системные. нужно обновлять только прогу и сам обновлятор. да ито можно легко воспользоваться командой install
нах! обновлятор консольный делай он не будет либы юзать он сам по себе будет
Будте добры, не употребляйте слова «линух», «лялих» и т.п. Используйте слово «линукс».
В Линуксе можно изменить или удалить открытый файл. Например, если файл удалили, то он удалится с ФС только после того, как все программы его закроют. Новые программы его открыть уже не смогут, а старые будут продолжать с ним работать. Аналогично с изменением - новые программы откроют изменённую версию файла, а те программы, в которых файл был открыт до изменения, будут продолжать работать со старым содержимым.
кстати если под вендой хочешь сделать гуйный обновлятор но не Qt юза c++ builder какойнибудь старенькой версии.. как вариант..
Вообще посмотреть какой процесс держит файл можно через lsof .
Как найти процесс занимающий этот файл и убить его?
Можно еще провод из розетки вынуть.
Эта ошибка где появляется и после какой команды?
fallocate -l 3000M /mnt/3000MB.swap
вообще посмотреть какой процесс держит файл можно через lsof.
попробовал команду, вылез список длинной в несколько тысяч процессов :(
а можете полностью команду для файла написать? говорит
-bash: kill: init: arguments must be process or job IDs
может надо местами поменять команды swapon и chmod ? Ну, в смысле, порядок их вызова изменить.
Einstok_Fair ★★☆ ( 01.06.18 14:46:27 )
Последнее исправление: Einstok_Fair 01.06.18 14:46:54 (всего исправлений: 1)
На вообще регистрант выше неправ, ибо этот файл юзает не инит, а ядро.
Deleted ( 01.06.18 14:46:50 )
Последнее исправление: Deleted 01.06.18 14:47:53 (всего исправлений: 1)
не помогло, та же ошибка что и в начале
Блин, как же здорово, когда не очень безопасные команды вводят другие люди на своих компьютерах, а результат все равно получаешь ты. Я вот думал, что хотя бы паника будет.
социальная инженерия - ваше все, я так понимаю? Ожидал помощь на этом форуме. )
Здесь с такой формулировкой вопроса, как в ОП, над тобой обязательно будут хохмить. Видно, что человек совершенно не разбирается в вопросе, пытается вводить какие-то команды из интернета, и при этом не факт, что результат, если он таки его получит, будет тем, что он ожидал.
Уже советовали выше, и я повторю: сначала делай chmod, а потом swapon.
проблема еще в том, что я сам файл не могу найти :(
сначала swapoff сделай и потом меняй его свойства
что результат, если он таки его получит, будет тем, что он ожидал
вкратце - так выглядит любой процесс самообучения, не так ли?
я сам файл найти не могу, ни одна команда его не выцепляет. Пробовал whereis, grep, find. Подскажите где почитать про синтаксис команд тогда?
Я думаю в ребут просто должно уйти.
Я думаю в ребут просто должно уйти.
сделал ребут. Не помогло.
вкратце - так выглядит любой процесс самообучения, не так ли?
Подход «тыкать все подряд и смотреть на результат» где-то может и работает, но не при освоении линукса. Тут будет правильно сначала прочитать справку о каждой команде, что именно она делает, и только потом ее выполнять. Если что, справка обычно доступна через man
я сам файл найти не могу, ни одна команда его не выцепляет.
Перезагрузись, начни выполнять команды по списку, но chmod и swapon поменяй местами.
Ну тут разве что ошибка будет если у вас каталога /mnt нет.
Так и не должно было, я про то что будет если инит убить.
Давай по порядку. Чего ты хочешь добиться выполнением этих команд, какова конечная цель?
Подход «тыкать все подряд и смотреть на результат» где-то может и работает, но не при освоении линукса
виртуалка развернута как раз для того, чтобы делать так. Учиться, исправлять ошибки, узнавать. Вы же прекрасно понимаете, что в горах информации найти нормальный guide сложно. Ищу.
Перезагрузись, начни выполнять команды по списку, но chmod и swapon поменяй местами.
нет результата. То же самое - «текстовый занят» или «устройство или ресурс занято».
Не ищу готовое решение, хочу разобраться. Если файл занят - почему я не могу его стандартными командами найти? Если файл есть - почему тупой ребут не снимает процесс?
Чего ты хочешь добиться выполнением этих команд, какова конечная цель?
Разворачиваю мастерноду по инструкции. Разобрался за неделю в виртуалках, установил ОС, нормально позанимался сексом с ней. Аж сны снятся теперь.
Сейчас пошагово хочу просто найти ответы на текущие вопросы.
1. Убрать ошибку «текстовый файл занят».
2. убрать ошибку «устройство или ресурс занято»
Кто возвращает эту ошибку? Они возникает как результат выполнения какой-то команды? Какой?
Кто возвращает эту ошибку? Они возникает как результат выполнения какой-то команды? Какой?
как я понимаю, занят файл 3000MB.swap, если это вообще файл. Я пытаюсь обратиться к нему через команду fallocate -l 3000M /mnt/3000MB.swap
на этом этапе у меня задача понять,
1.есть ли этот файл
2.чем он занят
3.как его «освободить» все команды для этого нашел, и все уводят меня в глубину линукса) Плыву, короче..
Всем здравствуй. Нужна помощь гуру, help?! Столкнулся с такой проблемой fopen failed : No such file or directory Could not create “/home/andr/Desktop/“ Права стоят чтение и запись. Desktop 51мг Архив GZIP x86_64 GNU/Linux Debian
Покажи целиком команду которую запускаешь и ls -l /home/andr/ | grep Desktop
kardapoltsev ★★★★ ( 21.07.21 01:52:11 )
Последнее исправление: kardapoltsev 21.07.21 01:52:29 (всего исправлений: 1)
cp /usr/share/wordlists/rockyou.txt.gz ./Desktop
cp: Невозможно создать обычный файл ‘/Desktop/‘: это не каталог
cd: Нет такого файла или каталога : Desktop
ls -l /home/andr/ | grep Desktop
-rwxrwxr-x 1 andr adnr 53357329 июл 19 21:56 Desktop
Конечно нет. Есть «~/Desktop» или «$HOME/Desktop» или «/home/andr/Desktop». Одно из этих значений и подставляй в свои команды.
andytux ★★★ ( 21.07.21 08:40:43 )
Последнее исправление: andytux 21.07.21 08:41:38 (всего исправлений: 1)
cp /usr/share/wordlists/rockyou.txt.gz ./Desktop
cp: Невозможно создать обычный файл ‘/Desktop/‘: это не каталог
Ты эту команду из какой директории запускаешь? Запись ./Desktop предполагает что ты должен находиться в домашней директории своего юзера. Иначе используй абсолютный путь /home/user/Desktop
-rwxrwxr-x 1 andr adnr 53357329 июл 19 21:56 Desktop
Эмм, это не каталог. Юзер и группа тоже различаются.
-rwxrwxr-x 1 andr andr 53357329 июл 19 21:56 Desktop
Вот такое он выдаёт
Это не каталог. Это файл. Что говорит потом команда ls -l
Что это за файл и откуда он там взялся, уже другой вопрос. Попробуй команду file Desktop
Для начала нам нужна база паролей для брута. В Кали уже есть база из 14 миллионов паролей и она называется «rockyou». Давайте её найдём, перенесём и распакуем на рабочий стол. Команда locate rockyou.txt.gz ищет файл «rockyou.txt.gz» по всей системе. Вот, на скриншоте видно, что путь до файла/usr/share/wordlists/rockyou.txt.gz.Теперь давайте перенесём файл на рабочий стол командой cp/usr/share/wordlists/rockyou.txt.gz./Desktop/. Осталось только распаковать архив командой gunzip -f /Desktop/rockyou.txt.gz.
Здесь прекрасно все: кали, инструкция из вк и ТС, не понимающий, что делает, но уже крутой хакер.
Читайте также: