এটি একটি রেসের শর্তের কারণে ঘটেছে। 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",। বা অনুরূপ কিছু ...