Điều này hóa ra là do một điều kiện cuộc đua. cp
kiể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ì cp
lệ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 strace
ra 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 -p
hoặc bất kỳ hành động nào khác cố ghi đè lên một tệp. Sử dụng flock
có thể giúp tránh các điều kiện chủng tộc trong trường hợp như thế này.
||
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ự ...