답변:
이것은 경쟁 조건으로 인한 것으로 판명되었습니다. cp
대상 파일이 이미 존재하는지 확인하고 존재하지 않는 경우 덮어 씁니다. 이 cp
명령이 두 번 병렬로 실행되어 문제의 파일이 있는지 여부 를 확인한 후 파일을 작성 하기 전에 문제의 파일이 나타나는 경우가 발생 했습니다 . strace
출력은 다음과 같습니다 :
# Command was "cp a b"
stat("b", 0x7fff89510620) = -1 ENOENT (No such file or directory)
stat("a", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("b", 0x7fff895103a0) = -1 ENOENT (No such file or directory)
# File b will be created at this point in time
open("a", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
open("b", O_WRONLY|O_CREAT|O_EXCL, 0644) = -1 EEXIST (File exists)
이것을 잡는 데 사용되는 bash 코드는 다음과 같습니다.
#!/bin/bash
touch a
f() {
while true; do
rm -f b
strace -o /tmp/cp${BASHPID}.trace cp a b || break
done
}
cleanup() {
kill -9 %1 %2
}
f &
f &
trap cleanup exit
wait
이 같은 오류는 mkdir -p
파일을 덮어 쓰려고 시도하거나 다른 작업에서 발생할 수 있습니다 . 를 사용하면 flock
이와 같은 경우 경쟁 조건을 피할 수 있습니다.
cp
cp
.
||
운영자 를 통해 처리하기로 결정했습니다 . 가난한 사람들의 시도 / 잡기. 즉cp ... || echo "skip copying due to other thread"
. 아니면 비슷한 ...