यह एक दौड़ की स्थिति के कारण निकला। 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
करने से इस तरह के मामलों में दौड़ की स्थिति से बचने में मदद मिल सकती है।
||
ऑपरेटर के माध्यम से संभालने के लिए चुना । एक कविता की कोशिश / पकड़ की तरह। यानी,cp ... || echo "skip copying due to other thread"
। या कुछ ऐसा ही ...