পারমাণবিক আপডেটের জন্য কোনও ফাইলে একচেটিয়া পঠন / লেখার লক পান


10

আমি এমন একটি ফাইল রাখতে চাই যা কাউন্টার হিসাবে ব্যবহৃত হয়। ব্যবহারকারী এ এই সংখ্যাটি লিখবেন এবং বৃদ্ধি করবেন, যখন ব্যবহারকারী বি ফাইলটি পড়ার জন্য অনুরোধ করবে। ব্যবহারকারী এ এর ​​লেখা শেষ না হওয়া অবধি কেউ এটি পড়তে বা লিখতে না পারলে ব্যবহারকারী এ ফাইলটি লক করতে পারবেন কি এটি সম্ভব?

আমি এটি দেখেছি flockকিন্তু আমি এটি প্রত্যাশা হিসাবে এটি কাজ পেতে বলে মনে হচ্ছে না।

flock -x -w 5 /dev/shm/counter.txt echo "4" >  /dev/shm/counter.txt && sleep 5

পারমাণবিক-জাতীয় বর্ধনকারী ফাইলটি পাওয়ার যদি আরও উপযুক্ত উপায় থাকে তবে এটি শুনতে খুব ভাল লাগবে!

আমার লক্ষ্য:

LOCK counter.txt; write to counter.txt;

একই সময়ে

Read counter.txt; realize it's locked so wait until that lock is finished.

1
"আশা করি এটি কাজ করতে পারে বলে মনে হয় না।" কি বিশেষভাবে যে মানে?
1024

আমি নিশ্চিত যে আমি এটি ভুলভাবে ব্যবহার করছি, তবে উপরের কোডটি ব্যবহার করার সময় আমি দুটি শাঁস ব্যবহার করতে পারি এবং সেগুলি উভয়কেই কাউন্টার ফাইলটি সম্পাদনা করতে পারি যখন আমি ভেবেছিলাম যে একটি এটি লক করছে। সুতরাং আমি যদি এই লাইনটি দুটি পৃথক শেলের উপর দু'বার চালিত করি, (প্রতিটি প্রতিধ্বনিত করতে তার নিজস্ব সংখ্যা সহ), আমি এখনও দ্বিতীয় সংখ্যাটি লেখা দেখছি
d -_-b

1
প্রথমটি যখন লকটি সম্পূর্ণ করে এবং ছেড়ে দেয় তখন দ্বিতীয়টি রান করে। এটা কি কাজ করা উচিত নয়? (উপরের কোডে, && sleep 5
ঝাঁকটি

হুম ইন্টারস্টিয়ারিং ... সুতরাং সেক্ষেত্রে আমার মানুষের চোখ ধরার পক্ষে খুব তাড়াতাড়ি হত। গ্রেট! আমার পরবর্তী চ্যালেঞ্জ হ'ল কীভাবে একাধিক কমান্ড স্থাপন flockকরা যায় তবে আমি এটিকে একটি পৃথক প্রশ্ন হিসাবে রাখি। ধন্যবাদ জন!
d -_- বি

3
@ d -_- বি আমি আপনার ব্যবহারকারীর নামটি পছন্দ করি। এটি আমি দেখেছি সবচেয়ে চতুর ব্যবহারকারী নাম।
ডেভন কলিয়ার জনসন

উত্তর:


10

নীচের কমান্ডটি বাশের প্রক্রিয়াজাতকরণ অবাক করে দিতে পারে:

flock -x -w 5 /dev/shm/counter.txt echo "4" >  /dev/shm/counter.txt && sleep 5

বাশ প্রথমে রান করে flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txtএবং যদি এটি সফলভাবে শেষ হয় (লকটি প্রকাশ করে), তবে এটি চলে sleep 5। সুতরাং, লকটি 5 সেকেন্ডের জন্য রাখা হয় না যেটি কেউ আশা করতে পারে।

একদিকে &ভার্সেস&&

যদি কারও দুটি কমান্ড থাকে Aএবং Bতা:

  1. A & BAব্যাকগ্রাউন্ডে শুরু হয় এবং তারপরে শেষ হওয়ার Bজন্য অপেক্ষা Aনা করে শুরু হয়।

  2. A && Bশুরু হয় A, এটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে এবং তারপরে এটি সফলভাবে সম্পন্ন হলে (প্রস্থান কোড 0), শুরু হয় B। যদি Aব্যর্থ হয় (ননজারো প্রস্থান কোড), তবে Bকখনও চালানো হবে না।

যোগফল, &এবং &&দুটি সম্পূর্ণ ভিন্ন তালিকা অপারেটর।


3
এটি যদি আমার মধ্যে অবাক হয় A && B, Aশেষ করার জন্য অপেক্ষা করছিল B
Andras Gyomrey

1
এন্ড এন্ড বি-তে, প্রথমে মৃত্যুদন্ড কার্যকর করা হয়। বি কার্যকর করা হয় কেবলমাত্র যদি একটি কার্যকর করা হয় এবং সফলভাবে বেরিয়ে আসে। ব্যবহার করা; এ এর কার্যকরী স্থিতি নির্বিশেষে বি সর্বদা খ কে কার্যকর করতে হবে
কেপাদ

15

ফাইল লকগুলি বাধ্যতামূলক নয় 1 - যেমন, আপনি কোনও ফাইল লক করতে পারবেন না যাতে অন্য প্রক্রিয়া এটি অ্যাক্সেস করতে না পারে। একটি ফাইল লক করার অর্থ হ'ল কোনও (নটর) প্রক্রিয়া যদি এটি লক হয়েছে কিনা তা পরীক্ষা করে দেখলে তা জেনে যাবে।

এর উদ্দেশ্য flockহ'ল আপনি যা চান তা স্টাফ করা, তবে আপনাকে অবশ্যই প্রতিটি চেষ্টা করা অ্যাক্সেসের জন্য ব্যবহারflock করতে হবে । মনে রাখবেন সেগুলি কলগুলি অবরুদ্ধ করছে; থেকে man flock:

যদি লকটি তাত্ক্ষণিকভাবে অধিগ্রহণ করা যায় না, তবে লকটি উপলব্ধ না হওয়া অবধি পলক অপেক্ষা করে


১. এটি বৈশিষ্ট্যটিকে অকেজো বলে মনে করে যদি আপনি এটি ব্যবহার করে, উদাহরণস্বরূপ, সুরক্ষা, তবে এটি ফাইল লকগুলির উদ্দেশ্য নয় - এগুলি সিঙ্ক্রোনাইজেশনের জন্য রয়েছে, যা আপনি করছেন। ব্যবহারকারী লিও উল্লেখ করেছিলেন যে অন্যান্য * নিক্স অপারেটিং সিস্টেমের historicalতিহাসিক সমান্তরালের উপর ভিত্তি করে লিনাক্স কার্নেলে বাধ্যতামূলক ফাইল লকিংয়ের ( এই আলোচনাটি দেখুন ) একটি মানহীন বাস্তবায়ন হতে পারে । তবে এটি কেবল সি স্তরের ইন্টারফেস বলে মনে হচ্ছে।


ধন্যবাদ! এটি 'উপদেষ্টা' দিকটি এবং আমার flockপ্রতিবার কীভাবে ব্যবহার করা দরকার তা অনুধাবন করতে সহায়তা করে । খুব উপকারী!
d -_- বি

2

আপনি "sh -c কমান্ড ..." ব্যবহার করে ফাইলটি পুনর্নির্দেশসহ পুরো শেল কমান্ডটি চালাতে লকটি ধারণ করে চালাতে পারেন। এছাড়াও, যেহেতু আপনি ফাইলটি কাউন্টার হিসাবে ব্যবহার করছেন, আপনি পড়ার সময় এবং লেখার পিছনে অবিচ্ছিন্নভাবে লকটি ধরে রাখতে হবে। সুতরাং আপনি কাউন্টারকে বাড়ানোর জন্য এই জাতীয় কিছু করতে চাইবেন এবং এর নতুন মানটি ফিরিয়ে দিন:

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'read count < /dev/shm/counter.txt ; echo $((count + 1)) > /dev/shm/counter.txt ; echo $((count + 1))'

বর্ধিত চিহ্নগুলিকে বিয়োগ চিহ্নগুলিতে পরিবর্তন করলে পাল্টা হ্রাস করা উচিত:

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'read count < /dev/shm/counter.txt ; echo $((count - 1)) > /dev/shm/counter.txt ; echo $((count - 1))'

আমি আশা করি যে কোনও বিতর্ক হওয়ার আগে আপনি কাউন্টারটি শুরু করবেন, সুতরাং তাড়াতাড়ি লক করে ফেলার বিষয়ে চিন্তা করার দরকার নেই:

echo 0 > /dev/shm/counter.txt

আমি মনে করি না যে বিতর্ক দেখা দিতে পারে এমন সময় আপনার কখনই পাল্টা মানটি আঁকিয়ে নেওয়া দরকার would তবে আপনি যদি কখনও করেন তবে আপনার এভাবে করা উচিত:

flock --exclusive --wait 5 /dev/shm/counter.txt sh -c 'echo 0 > /dev/shm/counter.txt'

আমি মনে করি আপনি পড়তে কীভাবে করবেন তা বুঝতে পেরেছি তবে আমি এটি সম্পূর্ণতার জন্য অন্তর্ভুক্ত করেছি:

flock --shared /dev/shm/counter.txt cat /dev/shm/counter.txt

এই প্রদর্শিত হয় শুধুমাত্র উত্তর সঠিকভাবে নোটিশ যে প্রশ্নে, ফাইল শেল দ্বারা সামনে পাল এমনকি খোলা পরার যে হতে চালায় ...
eichin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.