¿Qué operación genera el error "archivo de texto ocupado"? No puedo decir exactamente.
Creo que está relacionado con el hecho de que estoy creando un script temporal de Python (usando tempfile) y usando execl a partir de él, pero creo que execl cambia el archivo que se está ejecutando.
Text file busy
error en específico se trata de intentar modificar un ejecutable mientras se está ejecutando. El "Texto" aquí se refiere al hecho de que el archivo que se está modificando es el segmento de texto para un programa en ejecución. Este es un caso muy especial, y no el genérico que su respuesta parece sugerir. Aun así, su respuesta no es del todo incorrecta.Ha pasado un tiempo desde que vi ese mensaje, pero solía prevalecer en el Sistema V R3 o hace un par de décadas. En aquel entonces, significaba que no podía cambiar el ejecutable de un programa mientras se estaba ejecutando.
Por ejemplo, estaba construyendo un
make
trabajo llamadormk
, y después de un tiempo fue autosuficiente. Ejecutaría la versión de desarrollo y haría que construyera una nueva versión. Para que funcione, fue necesario utilizar la solución alternativa:Entonces, para evitar problemas con el 'archivo de texto ocupado', la compilación creó un nuevo archivo
rmk1
, luego movió el antiguormk
armk2
(cambiar el nombre no fue un problema; desvincularlo fue), y luego movió el nuevo compiladormk1
armk
.No he visto el error en un sistema moderno en bastante tiempo ... pero no siempre tengo programas que se están reconstruyendo.
fuente
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
. Produje el mensaje de error "cp: no se puede crear el archivo normal 'a.out': archivo de texto ocupado" en mi nueva Fedora.unlink
por defecto.Fuente: http://wiki.wlug.org.nz/ETXTBSY
fuente
Ejemplo de reproducción mínima C POSIX ejecutable
Recomiendo comprender la API subyacente para ver mejor lo que está sucediendo.
dormir.c
ocupado.c
Compilar y ejecutar:
busy.out
pasa las afirmaciones yperror
salidas:entonces deducimos que el mensaje está codificado en glibc.
Alternativamente:
hace la salida de Bash:
Para una aplicación más compleja, también puede observarla con
strace
:que contiene:
Probado en Ubuntu 18.04, kernel de Linux 4.15.0.
El error no ocurre si
unlink
primeronotbusy.c:
Luego compila y ejecuta de forma análoga a la anterior, y esas afirmaciones pasan.
Esto explica por qué funciona para ciertos programas pero no para otros. Por ejemplo, si lo haces:
eso no genera un error, aunque la segunda
gcc
llamada esté escribiendo ensleep.out
.Un rápido
strace
muestra que GCC primero se desvincula antes de escribir:contiene:
La razón por la que no falla es que cuando
unlink
y reescribe el archivo, crea un nuevo inodo y mantiene un inodo colgante temporal para el archivo ejecutable en ejecución.Pero si solo
write
sinunlink
, entonces intenta escribir en el mismo inodo protegido que el ejecutable en ejecución.POSIX 7
open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
hombre 2 abierto
fuente
unlink
. ¿Linux lee alguna vez el archivo más de una vez después de la primeraexec
llamada?En mi caso, estaba tratando de ejecutar un archivo shell (con una extensión .sh) en un entorno csh, y recibí ese mensaje de error.
solo correr con bash funcionó para mí. Por ejemplo
fuente
#!/bin/bash
encabezado?#!/usr/bin/csh
o equivalente.Si intenta construir
phpredis
en un cuadro de Linux, es posible que deba darle tiempo para completar la modificación de los permisos del archivo, con unsleep
comando, antes de ejecutar el archivo:fuente
chmod
que regrese antes de establecer los permisos. Eso podría ser un problema del sistema de archivos.No sé la causa, pero puedo contribuir con una solución rápida y fácil.
Acabo de experimentar esta rareza en CentOS 6 después de "cat> shScript.sh" (pegar, ^ Z) y luego editar el archivo en KWrite. Curiosamente no hubo una instancia discernible (ps -ef) de la ejecución del script.
Mi trabajo rápido fue simplemente "cp shScript.sh shScript2.sh" y luego pude ejecutar shScript2.sh. Luego borré ambos. ¡Hecho!
fuente
cat
proceso. La próxima vez use ^ D, no ^ Z.Puede encontrar que esto es más común en los recursos compartidos de red CIFS / SMB. Windows no permite que se escriba un archivo cuando algo más tiene ese archivo abierto, e incluso si el servicio no es Windows (podría ser algún otro producto NAS), es probable que reproduzca el mismo comportamiento. Potencialmente, también podría ser una manifestación de algún problema NAS subyacente vagamente relacionado con el bloqueo / replicación.
fuente
Si está ejecutando .sh desde una conexión ssh con una herramienta como MobaXTerm, y si dicha herramienta tiene una utilidad de autoguardado para editar archivos remotos desde la máquina local, eso bloqueará el archivo.
Cerrar y volver a abrir la sesión SSH lo resuelve.
fuente
Una de mi experiencia:
Siempre cambio el método abreviado de teclado predeterminado de Chrome mediante ingeniería inversa. Después de la modificación, olvidé cerrar Chrome y ejecuté lo siguiente:
Usando strace, puedes encontrar más detalles:
fuente
Encontré esto en PHP cuando lo usaba
fopen()
en un archivo y luego lo intentabaunlink()
antes de usarlofclose()
.No es bueno:
Bueno:
fuente
fuente