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