일반 파일 'filename'을 만들 수 없습니다 : 파일이 존재합니다


23

빌드 스크립트 중 하나에서이 이상한 오류 메시지가 나타났습니다. cp실패하고 "파일이 있습니다"라는 오류가 반환됩니다. cp -f파일이 존재하는 경우 파일을 덮어 써야하지만을 사용하여 시도 했지만 오류가 계속 나타납니다. cp기존 파일을 덮어 쓰려고 실행 하면 수동으로 할 때 완벽하게 작동합니다. 이 오류의 원인은 무엇입니까?

답변:


25

이것은 경쟁 조건으로 인한 것으로 판명되었습니다. 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 ... || echo "skip copying due to other thread". 아니면 비슷한 ...
— icfantv

싱글을 실행하는 동안이 문제가 발생했습니다.cp
— ZhaoGang

같은 문제에 부딪쳤다. 어떻게 디버깅 했습니까?
— CIsForCookies

실패에 대한 strace를 얻었다 cp.
— lutzky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.