tidak dapat membuat 'nama file' file biasa: File ada

23

Saya menerima pesan kesalahan aneh ini di salah satu skrip build saya - cpgagal, mengembalikan kesalahan "File ada". Saya bahkan sudah mencoba menggunakan cp -f, yang seharusnya menimpa file jika ada, tetapi kesalahan masih muncul. Berlari cpuntuk menimpa file yang ada berfungsi dengan sempurna ketika saya melakukannya secara manual. Apa yang bisa menyebabkan kesalahan ini?

Lutzky
sumber

Jawaban:

25

Ini ternyata disebabkan oleh kondisi balapan. cpmemeriksa apakah file tujuan sudah ada, dan jika tidak - menimpanya. Masalahnya terjadi karena cpperintah ini dijalankan dua kali secara paralel, yang menyebabkan file tersebut terkadang muncul setelah memeriksa apakah ada, tetapi sebelum upaya untuk membuat file. The straceOutput terlihat seperti ini:

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

Berikut beberapa kode bash yang digunakan untuk menangkap ini:

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

Kesalahan yang sama ini dapat terjadi dengan mkdir -patau tindakan lain yang mencoba menimpa file. Menggunakan flockdapat membantu menghindari kondisi balapan dalam kasus seperti ini.

Lutzky
sumber
Saya mengalami situasi yang sama persis ini. Saya memilih untuk menanganinya melalui ||operator. Semacam mencoba / menangkap poorman. Yaitu cp ... || echo "skip copying due to other thread",. Atau sesuatu yang serupa ...
icfantv
Saya mengalami masalah ini saat menjalankan satucp
ZhaoGang
Berlari ke masalah yang sama. Bagaimana Anda men-debug-nya?
CIsForCookies
Ada yang gagal cp.
lutzky