Ini ternyata disebabkan oleh kondisi balapan. cp
memeriksa apakah file tujuan sudah ada, dan jika tidak - menimpanya. Masalahnya terjadi karena cp
perintah ini dijalankan dua kali secara paralel, yang menyebabkan file tersebut terkadang muncul setelah memeriksa apakah ada, tetapi sebelum upaya untuk membuat file. The strace
Output 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 -p
atau tindakan lain yang mencoba menimpa file. Menggunakan flock
dapat membantu menghindari kondisi balapan dalam kasus seperti ini.
||
operator. Semacam mencoba / menangkap poorman. Yaitucp ... || echo "skip copying due to other thread"
,. Atau sesuatu yang serupa ...