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_dirse define comoxxx/app/cache
Entonces lo veo así: rmeliminé todo en el cache/proddirectorio, luego justo antes de intentar eliminar el cache/proddirectorio; otro programa creó un archivo / un directorio dentro de él, por lo que causó un rmerror.
¿Es correcta mi suposición?

rm -rno es atómica. Si desea asegurarse de que no se creen más archivos en el directorio mientras serm -rfestá ejecutando, puede cambiarle el nombre primero y luego eliminar el directorio renombrado.rm -rfser seguro para subprocesos: si lo ejecuta varias veces al mismo tiempo en el mismo directorio, el directorio se eliminará. Esto se trata derm -rno ser atómico.rminvocació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 dermintentar eliminar el directorio, dando elENOTEMPTYerror 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 xmuestra que un directorio puede eliminarse incluso cuando los archivos están en uso, independientemente de si están abiertos para leer o escribir.rmse queja de errores de permisos, por lo que creo que podemos eliminar eso. Sin embargo, no tengo la confianza suficiente para publicar una respuesta.