![Eliminación atómica del directorio.](https://rvso.com/image/36018/Eliminaci%C3%B3n%20at%C3%B3mica%20del%20directorio..png)
Debido a que rename(2)
es llamado por mv
, ¿es seguro asumir que lo siguiente sería atómico?
$ mv /home/me/someDir /tmp/toBeDeleted
$ rm -rf /tmp/toBeDeleted
Respuesta1
Elmv
dominiollama alrename
llamada al sistema, que se garantiza que es atómico. Sin embargo, hay dos excepciones:
- Si el origen y el destino están en sistemas de archivos diferentes, lo cual es relativamente común para
/home
vs./tmp
,rename
falla ymv
luego funciona copiando el árbol de origen en el destino y luego eliminando el árbol de origen. Evidentemente esto no es atómico. - Hay sistemas de archivos que
rename
no son atómicos, como ciertas implementaciones de NFS. En cualquier sistema de archivos local "normal",rename
es atómico.
Respuesta2
Si los directorios están en la misma partición de hardware montada como un único sistema de archivos, entonces mover algo es en realidad simplemente cambiarle el nombre a una ruta diferente. Sin embargo, si no es así, es posible que sea necesario leer y copiar cada archivo que contiene, por lo que ninguna parte del movimiento sería atómica. Como señala Gilles, POSIX estipula que este es el caso de los sistemas de archivos discretos.
Excepto eso, una verificación rápida con strace
confirmaciones mv
utiliza la rename()
llamada al sistema (que no debe confundirse con rename
, la utilidad de línea de comando). Eso haría que mv
un directorio fuera atómico desde la perspectiva del espacio de usuario. La rename()
llamada al sistema arrojará un error EBUSY si:
oldpath o newpath es un directorio que está siendo utilizado por algún proceso (quizás como directorio de trabajo actual, o como directorio raíz, o porque estaba abierto para lectura) o que está siendo utilizado por el sistema (por ejemplo, como punto de montaje), mientras que el El sistema considera esto como un error. (Tenga en cuenta que no es necesario devolver EBUSY en tales casos; de todos modos, no hay nada de malo en cambiar el nombre, pero está permitido devolver EBUSY si el sistema no puede manejar tales situaciones).
De man 2 rename
. La conexión con la "atomicidad" aquí es que no puede interrumpir otro proceso que esté trabajando en el directorio, y otro proceso no puede interrumpir esto; terminará con una ruta no válida/error de tipo no encontrado si lo supera. la persecución.
Respuesta3
Ambas respuestas dicen esencialmente lo mismo, pero solo se centran en un aspecto de la eliminación.
Si tiene un shell cuyo directorio de trabajo está dentro del árbol de directorios renombrado/movido, continuaráveryusaresos archivos hasta que realmente se eliminen. Debido a esto, el shell verá los archivos en distintos estados de eliminación y, en consecuencia, cambiará el nombre/moverá (mientras puedeser"atómico"en sí mismo) esnouna forma atómica de eliminación desde el punto de vista de todos los usuarios de los archivos. Sólo afecta a los usuarios cuyo shell está fuera del árbol de directorios desde el principio.
El shell mantiene su propia información sobre en qué directorio se encuentra. Esto se debe a que en algunas configuraciones puede cambiar el directorio actual a uno en el que no tenga permisos para leer la cadena de información del directorio necesaria para determinar la ruta real, por ejemplo, siguiendo un enlace simbólico a un directorio protegido.
POSIX es vago sobre el motivo del comportamiento, pero señala el comportamiento porpwd
(cáscara incorporada) ycd
(cáscara incorporada).