परमाणु अद्यतनों के लिए किसी फ़ाइल पर अनन्य रीड / राइट लॉक प्राप्त करें


10

मैं एक फ़ाइल है जो एक काउंटर के रूप में उपयोग किया जाता है चाहता हूँ। उपयोगकर्ता A इस नंबर को लिखेगा और बढ़ाएगा, जबकि उपयोगकर्ता B फ़ाइल को पढ़ने का अनुरोध करता है। क्या यह संभव है कि उपयोगकर्ता ए इस फ़ाइल को लॉक कर सकता है ताकि कोई भी इसे पढ़ या लिख ​​न सके जब तक उपयोगकर्ता ए का लेखन समाप्त नहीं हो जाता?

मैंने देखा है, 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
"मुझे लगता है मैं उम्मीद के रूप में काम करने के लिए यह प्रतीत नहीं कर सकते।" विशेष रूप से इसका क्या मतलब है?
1910 में जॉन 1024

मुझे यकीन है कि मैं इसे गलत तरीके से उपयोग कर रहा हूं, लेकिन ऊपर दिए गए कोड का उपयोग करते समय मैं दो गोले का उपयोग कर सकता हूं और उन दोनों को काउंटर फाइल को संपादित कर सकता हूं जबकि मुझे लगा कि एक इसे लॉक कर रहा है। इसलिए अगर मैं उस लाइन को दो अलग-अलग गोले पर दो बार चलाता हूं, (प्रत्येक को अपने स्वयं के नंबर के साथ प्रतिध्वनि करने के लिए), मैं अभी भी दूसरे नंबर को लिखा हुआ देख रहा हूं
d -_- b

1
जब पहला पूरा हो जाता है और अपना लॉक जारी करता है, तो दूसरा चलता है। नहीं है कि जिस तरह से यह काम करना चाहिए? (ऊपर दिए गए कोड में, झुंड को ताला जारी करने के बाद&& sleep 5 निष्पादित किया जाता है ।)
जॉन 1024

हम्म इंटरस्टिंग ... तो उस स्थिति में यह मेरी मानव आंख को पकड़ने के लिए बहुत जल्दी होता। महान! मेरी अगली चुनौती यह है कि कैसे कई कमांडों को रखा जाए flock, लेकिन मैं इसे एक अलग प्रश्न के रूप में रखूँगा। धन्यवाद जॉन!
d -_- b

3
@d -_- b मुझे आपका उपयोगकर्ता नाम पसंद है। वह सबसे चालाक उपयोगकर्ता नाम है जिसे मैंने कभी देखा है।
डेविन कोलियर जॉनसन

जवाबों:


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
एंड्रास गियोम्रे

1
A && B में, A को पहले निष्पादित किया जाता है। B को केवल तभी निष्पादित किया जाता है जब A निष्पादित और सफलतापूर्वक समाप्त हो जाता है। का उपयोग; B हमेशा A की निष्पादन स्थिति की परवाह किए बिना B को निष्पादित करता है
kapad

15

फ़ाइल ताले 1 अनिवार्य नहीं हैं - यानी, आप किसी फ़ाइल को लॉक नहीं कर सकते हैं ताकि कोई अन्य प्रक्रिया उस तक पहुंच सके। एक फ़ाइल का मतलब है कि अगर एक (nother) प्रक्रिया को लॉक करना चेकों देखने के लिए अगर यह बंद कर दिया गया है, यह पता चल जाएगा।

इसका उद्देश्य flockयह है कि आप जो चाहते हैं, जैसे सामान करना चाहते हैं, लेकिन आपको प्रत्येक प्रयास का उपयोगflock करना चाहिए । ध्यान रखें कि वे कॉल को रोक रहे हैं; से man flock:

यदि लॉक को तुरंत अधिग्रहीत नहीं किया जा सकता है, तो ताला उपलब्ध होने तक प्रतीक्षा करता है


1. जो सुविधा को बेकार लगता है यदि आप इसका उपयोग कर रहे हैं, जैसे, सुरक्षा, लेकिन यह फ़ाइल लॉक का उद्देश्य नहीं है - वे सिंक्रनाइज़ेशन के लिए हैं, जो आप कर रहे हैं। उपयोगकर्ता लियो ने बताया कि अन्य * निक्स ऑपरेटिंग सिस्टम से ऐतिहासिक समानता के आधार पर लिनक्स कर्नेल में अनिवार्य फ़ाइल लॉकिंग का गैर मानकीकृत कार्यान्वयन हो सकता है ( इस चर्चा को देखें )। हालाँकि, यह केवल C स्तर का इंटरफ़ेस है।


धन्यवाद! यह 'सलाहकार' पहलू की समझ बनाने में मदद करता है और मुझे flockहर बार कैसे उपयोग करना है। बहुत मददगार!
d -_- b

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

मुझे नहीं लगता कि विवाद होने पर आपको कभी काउंटर वैल्यू को रोकना होगा, लेकिन अगर आपने कभी ऐसा किया है, तो आपको ऐसा करना चाहिए:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.