ไม่สามารถสร้างไฟล์ 'ชื่อไฟล์' ปกติ: มีไฟล์อยู่


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)

นี่คือรหัสทุบตีบางส่วนที่ใช้ในการตรวจจับนี้:

#!/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สามารถช่วยหลีกเลี่ยงสภาพการแข่งขันในกรณีเช่นนี้


ฉันวิ่งเข้าไปในสถานการณ์เดียวกันนี้แน่นอน ฉันเลือกที่จะจัดการมันผ่าน||โอเปอเรเตอร์ เรียงลำดับของลอง / จับ poorman 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.