নতুন -C
বিকল্পটি সন্তোষজনক নয়, কারণ এটি ব্যবহারের সময়-যাচাই-বাছাই (ট্যাকটিউইউ) রেস শর্তের জন্য উন্মুক্ত। যদি দুটি প্রক্রিয়া একই সময়ে প্রায় একই নিয়ম যুক্ত করার চেষ্টা করে তবে -C
এটিকে দু'বার যুক্ত করা থেকে রক্ষা করবে না।
সুতরাং, এটি grep
সমাধানের চেয়ে আসলে ভাল কিছু নয় । আউটপুট উপর একটি সঠিক পাঠ্য প্রক্রিয়াকরণ iptables-save
কাজ হিসাবে নির্ভরযোগ্যভাবে কাজ করতে পারে -C
, যেহেতু আউটপুট টেবিলগুলির রাজ্যের একটি নির্ভরযোগ্য স্ন্যাপশট।
যা প্রয়োজন তা হ'ল একটি --ensure
বিকল্প যা পরমাণুগতভাবে এটির উপস্থিতি না থাকলে কেবল একটি নিয়ম পরীক্ষা করে এবং যুক্ত করে। তদ্ব্যতীত, নিয়মটি সঠিক অবস্থানে স্থানান্তরিত হলে এটি চমৎকার হবে যেখানে ইতিমধ্যে অস্তিত্ব না থাকলে একটি নতুন নিয়ম সন্নিবেশ করা হবে ( --ensure-move
)। উদাহরণস্বরূপ যদি iptables -I 1
কোনও শৃঙ্খলের মাথায় কোনও নিয়ম তৈরি করতে ব্যবহৃত হয় তবে সেই নিয়মটি ইতিমধ্যে সপ্তম অবস্থানে রয়েছে, তবে বিদ্যমান নিয়মটি প্রথম অবস্থানে চলে যেতে হবে।
এই বৈশিষ্ট্যগুলি ব্যতীত, আমি মনে করি যে এই ছদ্ম কোডের উপর ভিত্তি করে একটি শেল স্ক্রিপ্ট লুপটি লেখার একটি সম্ভাব্য কাজ রয়েছে:
while true ; do
# delete all copies of the rule first
while copies_of_rule_exist ; do
iptables -D $RULE
done
# now try to add the rule
iptables -A $RULE # or -I
# At this point there may be duplicates due to races.
# Bail out of loop if there is exactly one, otherwise
# start again.
if exactly_one_copy_of_rule_exists ; then
break;
fi
done
এই কোডটি চারদিকে ঘুরতে পারে; এটি গ্যারান্টি দেয় না যে দু'জন বা আরও বেশি রেসারের একটি নির্দিষ্ট সংখ্যার পুনরাবৃত্তি হবে। কিছু এলোমেলো তাত্পর্যপূর্ণ ব্যাক অফ ঘুমগুলি এটিতে সহায়তা করতে যোগ করা যেতে পারে।