Acabo de detectar un error confuso:
rm: cannot remove `xxx/app/cache/prod': Directory not empty
que fue causado por el siguiente comando:
rm -rf $cache_dir/*
donde $cache_dir
se define comoxxx/app/cache
Entonces lo veo así: rm
eliminé todo en el cache/prod
directorio, luego justo antes de intentar eliminar el cache/prod
directorio; otro programa creó un archivo / un directorio dentro de él, por lo que causó un rm
error.
¿Es correcta mi suposición?
rm -r
no es atómica. Si desea asegurarse de que no se creen más archivos en el directorio mientras serm -rf
está ejecutando, puede cambiarle el nombre primero y luego eliminar el directorio renombrado.rm -rf
ser seguro para subprocesos: si lo ejecuta varias veces al mismo tiempo en el mismo directorio, el directorio se eliminará. Esto se trata derm -r
no ser atómico.rm
invocación, podemos hablar sobre seguridad de thread. Pero de todos modos, no cambia nadaRespuestas:
El mensaje de error dado fue "Directorio no vacío" (
ENOTEMPTY
), dado que su suposición suena correcta, que es una condición de carrera donde un programa creó un archivo en ese directorio justo antes derm
intentar eliminar el directorio, dando elENOTEMPTY
error esperado del subyacentermdir(2)
.NOTA: para estar seguro, puede mover / cambiar el nombre del directorio a un nuevo nombre y luego ejecutar la eliminación de este directorio.
fuente
mkdir x; cat > x/a &; tail -f x/a &; rm -r x
muestra que un directorio puede eliminarse incluso cuando los archivos están en uso, independientemente de si están abiertos para leer o escribir.rm
se queja de errores de permisos, por lo que creo que podemos eliminar eso. Sin embargo, no tengo la confianza suficiente para publicar una respuesta.