আপনি এনএফএস সম্পর্কে জিজ্ঞাসা করেছেন। এই জাতীয় কোডটি এনএফএসের অধীনে ভেঙে যাওয়ার সম্ভাবনা রয়েছে, যেহেতু চেকের জন্য noclobberদুটি পৃথক এনএফএস অপারেশন জড়িত (ফাইল উপস্থিত রয়েছে কিনা তা পরীক্ষা করুন, নতুন ফাইল তৈরি করুন) এবং দুটি পৃথক এনএফএস ক্লায়েন্টের দুটি প্রক্রিয়া একটি রেস অবস্থায় আসতে পারে যেখানে উভয়ই সফল হয় ( উভয়ই যাচাই করে যা B.partএখনও বিদ্যমান নেই, তবে উভয়ই এটি সফলভাবে তৈরি করতে এগিয়ে যায়, ফলস্বরূপ তারা একে অপরকে ওভাররাইট করে're
আপনি যে ফাইল সিস্টেমটি লিখছেন noclobberসেটিকে পরমাণুগতভাবে বা না করার মতো কোনও কিছু সমর্থন করবে কিনা সে সম্পর্কে সত্যই জেনেরিক চেক করার দরকার নেই। আপনি ফাইল সিস্টেমের ধরণটি যাচাই করতে পারেন, এটি এনএফএস কিনা, তবে এটি গৌণবাদী এবং গ্যারান্টি নয় not এসএমবি / সিআইএফএস (সাম্বা) এর মতো ফাইল সিস্টেমগুলিও একই সমস্যায় ভুগতে পারে। FUSE- র মাধ্যমে ফাইল সিস্টেমগুলি সঠিকভাবে আচরণ করতে পারে বা নাও করতে পারে তবে এটি বেশিরভাগ বাস্তবায়নের উপর নির্ভর করে।
B.partএকটি অনন্য ফাইল নাম (অন্যান্য এজেন্টদের সহযোগিতার মাধ্যমে) ব্যবহার করে পদক্ষেপে সংঘর্ষ এড়ানো সম্ভবত সম্ভাবনাময় আরও ভাল উপায় যা আপনাকে নির্ভর করতে হবে না noclobber। উদাহরণস্বরূপ, আপনি ফাইলের নামের অংশ হিসাবে আপনার হোস্টনাম, পিআইডি এবং একটি টাইমস্ট্যাম্প (+ সম্ভবত একটি এলোমেলো সংখ্যা।) অন্তর্ভুক্ত করতে পারেন যেহেতু কোনও নির্দিষ্ট সময়ে কোনও হোস্টে একটি নির্দিষ্ট পিআইডি অধীনে চলমান একক প্রক্রিয়া থাকা উচিত, এটি হওয়া উচিত স্বতন্ত্রতা গ্যারান্টি।
সুতরাং যে কোনও একটি:
test -f B && continue # skip already existing
unique=$(hostname).$$.$(date +%s).$RANDOM
cp A B.part."$unique"
# Maybe check for existance of B again, remove
# the temporary file and bail out in that case.
mv B.part."$unique" B
# mv (rename) should always succeed, overwrite a
# previously copied B if one exists.
বা:
test -f B && continue # skip already existing
unique=$(hostname).$$.$(date +%s).$RANDOM
cp A B.part."$unique"
if ln B.part."$unique" B ; then
echo "Success creating B"
else
echo "Failed creating B, already existed"
fi
# Both cases require cleanup.
rm B.part."$unique"
সুতরাং আপনার যদি দুটি এজেন্টের মধ্যে রেসের শর্ত থাকে তবে তারা উভয়ই অপারেশন নিয়ে এগিয়ে যাবে তবে শেষ অপারেশনটি পারমাণবিক হবে, সুতরাং বি এর A এর সম্পূর্ণ অনুলিপি সহ উপস্থিত রয়েছে, বা B এর অস্তিত্ব নেই।
আপনি অনুলিপি পরে এবং আগে আবার চেক করে জাতি আকার কমে যায় mvবা lnঅপারেশন, কিন্তু এখনও একটি ছোট জাতি শর্ত আছে। তবে, বর্ণের শর্ত নির্বিশেষে, বি এর বিষয়বস্তুগুলি ধারাবাহিক হওয়া উচিত, ধরে নেওয়া উভয় প্রক্রিয়া এ থেকে তৈরি করার চেষ্টা করছে (বা উত্স হিসাবে কোনও বৈধ ফাইল থেকে একটি অনুলিপি))
মনে রাখবেন যে প্রথম পরিস্থিতিতে mvযখন একটি দৌড় বিদ্যমান তখন শেষ প্রক্রিয়াটি হ'ল কে জিতবে, যেহেতু পুনর্নবীকরণ (2) পরমাণুভাবে একটি বিদ্যমান ফাইলটি প্রতিস্থাপন করবে:
যদি নতুনপথ ইতিমধ্যে বিদ্যমান থাকে তবে এটি পরমাণুভাবে প্রতিস্থাপন করা হবে, যাতে নতুনপথ অ্যাক্সেস করার চেষ্টা করার অন্য কোনও প্রক্রিয়া এটি অনুপস্থিত খুঁজে পাবে এমন কোনও বিন্দু নেই। [...]
যদি নতুনপথ বিদ্যমান থাকে তবে কোনও কারণে অপারেশন ব্যর্থ হয়, rename()তবে নতুনপথের উদাহরণটি জায়গায় রাখার গ্যারান্টি দেয় ।
সুতরাং, বি সময়ে গ্রাস করা যথেষ্ট সম্ভাব্য প্রক্রিয়াগুলি এই প্রক্রিয়া চলাকালীন এর বিভিন্ন সংস্করণ (বিভিন্ন আইওনড) দেখতে পারে। যদি লেখকরা সকলেই একই বিষয়বস্তু অনুলিপি করার চেষ্টা করছেন, এবং পাঠকরা কেবল ফাইলের বিষয়বস্তু গ্রাস করছেন, এটি ঠিক হতে পারে, যদি তারা একই বিষয়বস্তুযুক্ত ফাইলগুলির জন্য পৃথক আইডোন পায় তবে তারা কেবল একই রকম খুশি হবে।
হার্ড লিঙ্কটি ব্যবহার করে দ্বিতীয় দৃষ্টিভঙ্গি আরও ভাল দেখায় , তবে আমি মনে করি অনেকগুলি সমসাময়িক ক্লায়েন্টের কাছ থেকে এনএফএসের উপর একটি টাইট লুপে হার্ডলিঙ্কগুলি নিয়ে পরীক্ষা-নিরীক্ষা করা এবং সাফল্য গণনা করা এবং এখনও সেখানে কিছু রেসের শর্ত রয়েছে বলে মনে হচ্ছে, যেখানে দুটি ক্লায়েন্ট একটি হার্ডলিঙ্ক জারি করেছে বলে মনে হয়েছিল একই গন্তব্য সহ একই সময়ে অপারেশন, উভয়ই সফল বলে মনে হয়েছিল। (এটি সম্ভবত এই আচরণটি নির্দিষ্ট এনএফএস সার্ভার বাস্তবায়নের সাথে সম্পর্কিত ছিল, ওয়াইএমএমভি।) যে কোনও ক্ষেত্রে, সম্ভবত এটি একই ধরণের রেসের শর্ত, যেখানে আপনার ভারী ভারী ক্ষেত্রে একই ফাইলের জন্য দুটি পৃথক পৃথক আইডোড প্রাপ্ত হতে পারে where এই জাতিগুলির শর্তগুলি ট্রিগার করতে লেখকদের মধ্যে সম্মতি। আপনার লেখকরা যদি সামঞ্জস্যপূর্ণ হন (উভয়কে A তে কপি করছেন), এবং আপনার পাঠকরা কেবল সামগ্রীগুলি গ্রাস করছেন, এটি যথেষ্ট be
অবশেষে, আপনি লকিংয়ের কথা উল্লেখ করেছেন। দুর্ভাগ্যক্রমে লকিংয়ের গুরুতর অভাব রয়েছে, কমপক্ষে এনএফএসভি 3-তে (এনএফএসভি 4 সম্পর্কে নিশ্চিত নয় তবে আমি বাজি ধরছি এটিও ভাল নয়।) আপনি যদি লকিংয়ের কথা বিবেচনা করছেন তবে আপনার সম্ভবত বিতরণকৃত লকিংয়ের জন্য বিভিন্ন প্রোটোকলটি সন্ধান করা উচিত, সম্ভবত ব্যান্ডের বাইরে প্রকৃত ফাইলের অনুলিপিগুলি, তবে এটি উভয়ই বাধাদানকারী, জটিল এবং ডেডলকগুলির মতো সমস্যাগুলির ঝুঁকিতে পড়েছে, তাই আমি এড়াতে পারাই ভাল।
এনএফএসে পারমাণবিকতার বিষয়ে আরও পটভূমির জন্য, আপনি মাইল্ডির মেলবক্স ফর্ম্যাটটিতে পড়তে চাইতে পারেন , যা লকগুলি এড়াতে এবং এমনকি এনএফএসে নির্ভরযোগ্যভাবে কাজ করার জন্য তৈরি করা হয়েছিল। এটি সর্বত্র অনন্য ফাইলের নাম রেখে এটি করে (যাতে আপনি শেষ পর্যন্ত একটি চূড়ান্ত বি পান না))
আপনার নির্দিষ্ট ক্ষেত্রে সম্ভবত কিছুটা আকর্ষণীয়, মাইল্ডির ++ ফর্ম্যাট মেলডিরকে মেলবক্স কোটার সমর্থন যোগ করার জন্য প্রসারিত করে এবং মেলবক্সের অভ্যন্তরে একটি নির্দিষ্ট নাম সহ কোনও ফাইল অ্যাটমিকভাবে আপডেট করে (যাতে এটি আপনার বি এর আরও নিকটবর্তী হতে পারে) আমি মনে করি মাইল্ডির ++ চেষ্টা করে যোগ করার জন্য, যা এনএফএস-এ সত্যিই নিরাপদ নয়, তবে একটি পুনর্বিবেচনা পদ্ধতি রয়েছে যা এর অনুরূপ একটি পদ্ধতি ব্যবহার করে এবং এটি পারমাণবিক প্রতিস্থাপন হিসাবে বৈধ।
আশা করি এই সমস্ত পয়েন্টার কার্যকর হবে!