Jaka operacja generuje błąd „plik tekstowy zajęty”? Nie jestem w stanie powiedzieć dokładnie.
Myślę, że jest to związane z faktem, że tworzę tymczasowy skrypt w Pythonie (używając pliku tymczasowego) i używam z niego execl, ale myślę, że execl zmienia uruchamiany plik.
Text file busy
Błąd w szczególnych wynosi około próbuje modyfikować plik wykonywalny, gdy jest on wykonywany. „Tekst” odnosi się tutaj do faktu, że modyfikowany plik jest segmentem tekstowym dla uruchomionego programu. Jest to bardzo szczególny przypadek, a nie ogólny, który sugeruje twoja odpowiedź. Mimo to twoja odpowiedź nie jest całkowicie błędna.Minęło trochę czasu, odkąd widziałem tę wiadomość, ale była powszechna w Systemie V R3 lub w tym miejscu dobre kilka dekad temu. W tamtych czasach oznaczało to, że nie można było zmienić pliku wykonywalnego programu podczas jego działania.
Na przykład
make
budowałem workalike o nazwiermk
, a po chwili sam się utrzymywał. Uruchomiłbym wersję rozwojową i kazałbym zbudować nową wersję. Aby to zadziałało, konieczne było zastosowanie obejścia:Tak więc, aby uniknąć problemów z `` plikiem tekstowym zajętym '', kompilacja utworzyła nowy plik
rmk1
, a następnie przeniosła staryrmk
dormk2
(zmiana nazwy nie była problemem; odłączenie było), a następnie przeniosła nowo zbudowany plikrmk1
dormk
.Nie widziałem błędu w nowoczesnym systemie od dłuższego czasu ... ale nie zawsze mam programy, które same się odbudowują.
źródło
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
. Wyświetla komunikat o błędzie „cp: nie można utworzyć zwykłego pliku 'a.out': plik tekstowy zajęty” na mojej nowej Fedorze.unlink
domyślnie.Źródło: http://wiki.wlug.org.nz/ETXTBSY
źródło
Minimalna, działająca reprodukcja C POSIX
Zalecam zrozumienie podstawowego interfejsu API, aby lepiej zobaczyć, co się dzieje.
spać. c
zajęty. c
Skompiluj i uruchom:
busy.out
przekazuje potwierdzenia i daneperror
wyjściowe:więc wnioskujemy, że wiadomość jest zakodowana na stałe w samym glibc.
Alternatywnie:
sprawia, że wyjście Bash:
W przypadku bardziej złożonej aplikacji można to również zaobserwować za pomocą
strace
:który zawiera:
Testowane na Ubuntu 18.04, jądro Linux 4.15.0.
Błąd nie występuje, jeśli
unlink
pierwszynotbusy.c
Następnie skompiluj i uruchom analogicznie do powyższego, a te potwierdzenia przejdą.
To wyjaśnia, dlaczego działa w niektórych programach, ale nie w innych. Np. Jeśli:
to nie generuje błędu, nawet jeśli drugie
gcc
wywołanie to zapissleep.out
.Szybkie
strace
pokazuje, że GCC pierwsze odłącza przed zapisem:zawiera:
Powodem, dla którego nie kończy się niepowodzeniem, jest to, że po
unlink
ponownym zapisaniu pliku tworzy on nowy i-węzeł i utrzymuje tymczasowo wiszący i-węzeł dla działającego pliku wykonywalnego.Ale jeśli po prostu
write
nieunlink
, to stara się pisać do tego samego węzła zabezpieczono jako uruchomiony wykonywalny.POSIX 7
open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
człowiek 2 otwarty
źródło glibc
Szybkie grep na 2.30 daje:
i ręczne trafienie w
manual/errno.texi
:źródło
unlink
. Czy Linux kiedykolwiek czyta plik więcej niż raz po pierwszymexec
wywołaniu?W moim przypadku próbowałem wykonać plik powłoki (z rozszerzeniem .sh) w środowisku csh i otrzymałem ten komunikat o błędzie.
po prostu bieganie z bashem zadziałało dla mnie. Na przykład
źródło
#!/bin/bash
nagłówek?#!/usr/bin/csh
lub odpowiednika.Jeśli próbujesz zbudować
phpredis
na komputerze z systemem Linux, być może będziesz musiał dać mu czas na dokończenie modyfikacji uprawnień do pliku za pomocąsleep
polecenia przed uruchomieniem pliku:źródło
chmod
aby powrócił przed ustawieniem uprawnień. To może być problem z systemem plików.Może się to okazać bardziej powszechne w przypadku udziałów sieciowych CIFS / SMB. System Windows nie pozwala na zapisanie pliku, gdy coś innego ma otwarty ten plik, a nawet jeśli usługą nie jest system Windows (może to być inny produkt NAS), prawdopodobnie odtworzy to samo zachowanie. Potencjalnie może to być również przejaw jakiegoś podstawowego problemu z NAS, niejasno związanego z blokowaniem / replikacją.
źródło
Jeśli uruchamiasz plik .sh z połączenia ssh za pomocą narzędzia takiego jak MobaXTerm i jeśli wspomniane narzędzie ma narzędzie automatycznego zapisywania do edycji zdalnego pliku z komputera lokalnego, spowoduje to zablokowanie pliku.
Zamknięcie i ponowne otwarcie sesji SSH rozwiązuje problem.
źródło
Nie znam przyczyny, ale mogę pomóc w szybkim i łatwym rozwiązaniu.
Właśnie doświadczyłem tej dziwności w CentOS 6 po
cat > shScript.sh
(wklej,^Z
) następnie edycji pliku w KWrite. Co dziwne, nie było zauważalnej instancji (ps -ef
) wykonywanego skryptu.Moja szybka praca polegała na
cp shScript.sh shScript2.sh
tym, że byłem w stanie wykonaćshScript2.sh
. Następnie usunąłem oba. Gotowe!źródło
cat
procesu. Następnym razem użyj ^ D, a nie ^ Z.Jedno z moich doświadczeń:
Zawsze zmieniam domyślny skrót klawiaturowy Chrome za pomocą inżynierii wstecznej. Po modyfikacji zapomniałem zamknąć Chrome'a i uruchomiłem:
Korzystając ze strace, możesz znaleźć więcej szczegółów:
źródło
Natknąłem się na to w PHP podczas używania
fopen()
na pliku, a następnie próbowałemunlink()
to przed użyciemfclose()
na nim.Nie dobrze:
$handle = fopen('file.txt'); // do something unlink('file.txt');
Dobry:
$handle = fopen('file.txt'); // do something fclose($handle); unlink('file.txt');
źródło
źródło