เรื่องนี้กลายเป็นว่าเกิดจากสภาพการแข่งขัน 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
สามารถช่วยหลีกเลี่ยงสภาพการแข่งขันในกรณีเช่นนี้
||
โอเปอเรเตอร์ เรียงลำดับของลอง / จับ poormancp ... || echo "skip copying due to other thread"
กล่าวคือ หรือบางอย่างที่คล้ายกัน ...