¿Es seguro paralelizar mkdir -p?

¿Es seguro paralelizar mkdir -p?

Estoy escribiendo reglas de Makefile como esta:

out/%.x: ...
    mkdir -p $(@D)/
    ...

Tengo la intención de paralelizar este Makefile ( -j), lo que activará muchos mkdir -psimultáneamente.

¿Es esto seguro? ¿O debo protegerme contra los problemas asegurándome mkdir -pde que solo ocurra una vez?

(Notaeso mkdir -pno es necesariamente una única operación a nivel del sistema de archivos, a diferencia de mkdir.)

Respuesta1

El fundamento dePOSIXmkdirdice

Debido a que no se produce ningún error si ya existe algún componente de ruta, el-pagLa opción también es útil para garantizar que exista un directorio en particular.

Esto sugiere que el uso paralelo debería ser seguro. Puedo entender tus dudas, dado el potencial de las carreras, así que veamos una implementación...

En GNU coreutils, la -popción termina siendo manejada pormkancesdirs, que tiene una descripción útil que debería disipar tus miedos:

Asegúrese de que existan los directorios ancestrales de FILE, utilizando un algoritmo que debería funcionar incluso si dos procesos ejecutan esta función en paralelo.

(En lugar de actuar inmediatamente ante los errores de mkdir, intenta chdiringresar a cada directorio de componentes y solo falla si eso falla).

Si estás usando GNU Make, puedes usar suexpansión secundariapara manejar directorios de la misma manera que otros requisitos previos:

.SECONDEXPANSION:

%/:
        mkdir -p $@

out/%.x: $$(@D)/ ...
        ...

información relacionada