không thể tạo tệp thông thường 'tên tệp': Tệp tồn tại


23

Tôi đã nhận được thông báo lỗi lạ này trong một trong các tập lệnh xây dựng của mình - cpkhông thành công, trả về lỗi "Tệp tồn tại". Tôi thậm chí đã thử sử dụng cp -f, nó sẽ ghi đè lên tệp nếu nó tồn tại, nhưng lỗi vẫn xuất hiện. Chạy cpđể ghi đè lên các tệp hiện có hoạt động hoàn hảo khi tôi thực hiện thủ công. Điều gì có thể gây ra lỗi này?

Câu trả lời:


25

Điều này hóa ra là do một điều kiện cuộc đua. cpkiểm tra xem tệp đích đã tồn tại chưa và nếu không - ghi đè lên nó. Vấn đề đã xảy ra bởi vì cplệnh này đã được chạy song song hai lần, điều này khiến cho tệp được đề cập đôi khi xuất hiện sau khi kiểm tra xem nó có tồn tại không, nhưng trước khi thử tạo tệp. Đầu stracera trông như thế này:

# 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)

Đây là một số mã bash được sử dụng để nắm bắt điều này:

#!/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

Lỗi tương tự này có thể xảy ra với mkdir -phoặc bất kỳ hành động nào khác cố ghi đè lên một tệp. Sử dụng flockcó thể giúp tránh các điều kiện chủng tộc trong trường hợp như thế này.


Tôi chạy vào tình huống chính xác như vậy. Tôi đã chọn để xử lý nó thông qua các ||nhà điều hành. Sắp xếp thử / bắt của poorman. Ví dụ cp ... || echo "skip copying due to other thread". Hoặc một cái gì đó tương tự ...
icfantv

Tôi gặp vấn đề này khi chạy một đĩa đơncp
ZhaoGang

Ran vào cùng một vấn đề. Làm thế nào bạn gỡ lỗi nó?
CIsForCookies

Có một bước tiến về sự thất bại cp.
lutzky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.