Tecnología · GUÍA PRÁCTICA
Linux dice “Text file busy”: identifica el inode ejecutado antes de sobrescribir o reintentar
ETXTBSY puede significar que un despliegue intentó escribir un ejecutable activo o que un lanzador intentó ejecutar un archivo aún abierto para escritura. Conserva syscall, proceso, inode y namespace antes de matar nada; después corrige la carrera o reemplaza la ruta atómicamente.

ETXTBSY puede significar que un despliegue intentó escribir un ejecutable activo o que un lanzador intentó ejecutar un archivo aún abierto para escritura. Conserva syscall, proceso, inode y namespace antes de matar nada; después corrige la carrera o reemplaza la ruta atómicamente.
execve() puede devolver ETXTBSY si el ejecutable está abierto para escritura. Una escritura o truncado puede rechazarse mientras se ejecuta el mismo inode.
1. Conserva dirección, ruta e inode
Registra error completo, hora, comando, PID, namespace de contenedor o montaje y operación fallida. Distingue exec, open, truncate, copy y rename; guarda dispositivo e inode con stat antes de reiniciar.
No empieces con reinicio, pkill -f o reintentos ilimitados. Tras reemplazar, la misma ruta puede nombrar otro inode y un contenedor puede no ver al dueño del host. Compara dispositivo e inode en el namespace que falló.
2. Demuestra ejecutor o escritor en el namespace correcto
Si sospechas un ejecutable activo, revisa /proc/<pid>/exe y una prueba limitada con fuser -v o equivalente. Las marcas de ejecución y escritura responden preguntas distintas; respeta permisos y no publiques rutas ajenas.
Para un fallo de exec, encuentra el proceso con descriptor escribible y revisa destino y banderas. Un descriptor sin close-on-exec puede heredarse durante otro spawn; inspecciona padres e hijos y detén solo al dueño demostrado.
3. Corrige la carrera escritura-ejecución sin ocultarla
Reproduce la secuencia mínima: crea un archivo hermano, escribe todo, fija el modo, ciérralo y ejecútalo. Bajo paralelismo, serializa la extracción de caché o usa rutas temporales por versión para evitar un objetivo compartido.
Corrige la vida del descriptor y usa close-on-exec cuando corresponda. Un reintento corto, limitado y exclusivo para ETXTBSY puede reducir una carrera residual, pero no sustituye cerrar al escritor ni eliminar la ruta compartida.
4. Publica un archivo hermano y reemplaza la ruta atómicamente
Nunca trunques en sitio un ejecutable activo. Escribe un hermano en el mismo sistema de archivos, fija propietario y modo, verifica hash y prueba directa; luego usa rename sobre el destino. Los procesos existentes continúan por el inode anterior.
Si importa la durabilidad ante caída, aplica la sincronización de archivo y directorio requerida. Reinicia o recarga solo el servicio controlado y conserva el artefacto anterior para reversión.
5. Acepta la recuperación con pruebas de proceso e inode
Confirma que /proc/<pid>/exe del PID nuevo resuelve a la ruta, dispositivo, inode y hash esperados. Si dejas el PID viejo drenando, verifica que siga ligado al inode anterior.
Ejecuta pruebas concurrentes que antes causaban ETXTBSY. La aceptación exige ausencia del error, ningún descriptor escribible persistente, permisos y hash correctos y reversión probada. Si falla, restaura la ruta anterior.
