일반 파일 '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.