mkdir -p를 병렬화해도 안전합니까?

mkdir -p를 병렬화해도 안전합니까?

나는 다음과 같은 Makefile 규칙을 작성하고 있습니다.

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

나는 동시에 여러 개를 트리거 -j하는 Makefile()을 병렬화할 계획입니다 .mkdir -p

이거 안전한가요? 아니면 mkdir -p문제가 한 번만 발생하도록 하여 문제가 발생하지 않도록 해야 합니까 ?

(노트달리 이는 mkdir -p파일 시스템 수준에서 반드시 단일 작업이 필요한 것은 아닙니다 mkdir. )

답변1

이유POSIXmkdir설명하다

경로 구성 요소가 이미 존재하는 경우 오류가 생성되지 않으므로-피옵션은 특정 디렉터리가 존재하는지 확인하는 데도 유용합니다.

이는 병렬 사용이 안전해야 함을 나타냅니다. 경쟁 가능성을 고려할 때 귀하의 우려를 이해할 수 있으므로 구현을 살펴보겠습니다.

GNU에서는 coreutils-p옵션이 궁극적으로mkancesdirs, 귀하의 두려움을 완화하는 데 도움이 되는 설명이 포함되어 있습니다.

두 프로세스가 이 기능을 병렬로 실행하더라도 작동해야 하는 알고리즘을 사용하여 FILE의 상위 디렉터리가 존재하는지 확인합니다.

(오류 발생 시 즉시 조치를 취하지 않고 mkdir대신 chdir각 구성 요소 디렉터리로 이동을 시도하며 실패할 경우에만 실패합니다.)

GNU Make를 사용한다면 이것을 사용할 수 있습니다두 번째 확장다른 필수 구성 요소와 동일한 방식으로 디렉터리를 처리합니다.

.SECONDEXPANSION:

%/:
        mkdir -p $@

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

관련 정보