Que operação gera o erro "arquivo de texto ocupado"? Eu sou incapaz de dizer exatamente.
Eu acho que está relacionado ao fato de eu estar criando um script python temporário (usando tempfile) e usando execl, mas acho que o execl altera o arquivo que está sendo executado.
Text file busy
erro específico é tentar modificar um executável enquanto está em execução. O "Texto" aqui refere-se ao fato de que o arquivo que está sendo modificado é o segmento de texto para um programa em execução. Este é um caso muito especial, e não o genérico que sua resposta parece sugerir. Mesmo assim, sua resposta não está totalmente incorreta.Faz um tempo desde que eu vi essa mensagem, mas costumava prevalecer no System V R3 ou cerca de algumas décadas atrás. Naquela época, isso significava que não era possível alterar um programa executável enquanto ele estava em execução.
Por exemplo, eu estava construindo um
make
workalike chamadormk
, e depois de um tempo ele se manteve. Eu rodaria a versão de desenvolvimento e a compilaria uma nova versão. Para fazê-lo funcionar, era necessário usar a solução alternativa:Portanto, para evitar problemas com o 'arquivo de texto ocupado', a compilação criou um novo arquivo
rmk1
, depois moveu o antigormk
pararmk2
(renomear não era um problema; desvincular era) e depois mudou o recém-criadormk1
pararmk
.Não vejo o erro em um sistema moderno há um bom tempo ... mas nem sempre os programas são reconstruídos.
fonte
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
. Produzi a mensagem de erro "cp: não é possível criar o arquivo regular 'a.out': arquivo de texto ocupado" no meu novo Fedora.unlink
por padrão.Fonte: http://wiki.wlug.org.nz/ETXTBSY
fonte
Exemplo mínimo de reprodução executável em C POSIX
Eu recomendo entender a API subjacente para ver melhor o que está acontecendo.
sleep.c
busy.c
Compile e execute:
busy.out
passa as afirmações eperror
produz:portanto, deduzimos que a mensagem está codificada na própria glibc.
Alternativamente:
produz saída Bash:
Para uma aplicação mais complexa, você também pode observá-la com
strace
:que contém:
Testado no Ubuntu 18.04, Linux kernel 4.15.0.
O erro não ocorre se você
unlink
primeironotbusy.c:
Em seguida, compile e execute analogamente ao acima, e essas afirmações passam.
Isso explica por que funciona em determinados programas, mas não em outros. Por exemplo, se você fizer:
isso não gera um erro, mesmo que a segunda
gcc
chamada esteja sendo gravadasleep.out
.Uma rápida
strace
mostra que o GCC primeiro se desvincula antes de escrever:contém:
O motivo para não falhar é que, quando você
unlink
reescreve o arquivo, ele cria um novo inode e mantém um inode temporário pendente para o arquivo executável em execução.Mas, se você apenas ficar
write
semunlink
, ele tenta gravar no mesmo inode protegido que o executável em execução.POSIX 7
open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
homem 2 aberto
fonte
unlink
. O Linux já leu o arquivo mais de uma vez após a primeiraexec
chamada?No meu caso, eu estava tentando executar um arquivo shell (com uma extensão .sh) em um ambiente csh e estava recebendo essa mensagem de erro.
apenas rodando com bash funcionou para mim. Por exemplo
fonte
#!/bin/bash
cabeçalho?#!/usr/bin/csh
ou equivalente.Se estiver tentando construir
phpredis
em uma caixa do Linux, talvez seja necessário tempo para concluir a modificação das permissões do arquivo, com umsleep
comando, antes de executar o arquivo:fonte
chmod
que retornaria antes que as permissões fossem definidas. Isso pode ser um problema do sistema de arquivos.Não sei a causa, mas posso contribuir com uma solução rápida e fácil.
Acabei de experimentar essa essa estranheza no CentOS 6 depois de "cat> shScript.sh" (colar, ^ Z) e depois editar o arquivo no KWrite. Estranhamente, não havia instância discernível (ps -ef) do script em execução.
Meu trabalho rápido foi simplesmente "cp shScript.sh shScript2.sh", depois pude executar o shScript2.sh. Então eu apaguei os dois. Feito!
fonte
cat
processo. Da próxima vez, use ^ D, não ^ Z.Você pode achar que isso é mais comum em compartilhamentos de rede CIFS / SMB. O Windows não permite que um arquivo seja gravado quando algo mais o abrir, e mesmo que o serviço não seja o Windows (pode ser outro produto NAS), provavelmente reproduzirá o mesmo comportamento. Potencialmente, também pode ser uma manifestação de algum problema subjacente do NAS vagamente relacionado ao bloqueio / replicação.
fonte
Se você estiver executando o .sh de uma conexão ssh com uma ferramenta como MobaXTerm, e se a ferramenta possuir um utilitário de gravação automática para editar arquivos remotos da máquina local, isso bloqueará o arquivo.
Fechar e reabrir a sessão SSH a resolve.
fonte
Uma das minhas experiências:
Sempre altero o atalho de teclado padrão do Chrome por meio de engenharia reversa. Após a modificação, esqueci de fechar o Chrome e executei o seguinte:
Usando strace, você pode encontrar mais detalhes:
fonte
Me deparei com isso no PHP ao usar
fopen()
um arquivo e depois tentarunlink()
antes de usarfclose()
-lo.Nada de bom:
Boa:
fonte
fonte