मैं कुछ डिस्क छवि सामग्री को संभालने के लिए कुछ शेल स्क्रिप्ट लिख रहा हूं, और मुझे कुछ डिस्क छवियों तक पहुंचने के लिए लूप डिवाइस का उपयोग करने की आवश्यकता है। हालांकि, मुझे यकीन नहीं है कि एक दौड़ हालत में अपने कार्यक्रम को उजागर किए बिना लूप डिवाइस को ठीक से कैसे आवंटित किया जाए।
मुझे पता है कि मैं losetup -f
अगले बिना लूप डिवाइस प्राप्त करने के लिए उपयोग कर सकता हूं , और फिर उस लूप डिवाइस को इस तरह आवंटित कर सकता हूं :
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
हालांकि, उस मामले में जहां मैं एक ही समय में कार्यक्रम के कई उदाहरणों को चलाना चाहता हूं, यह लगभग एक दौड़ की स्थिति का एक पाठ्यपुस्तक उदाहरण है, और यह मुझे काफी परेशान करता है। यदि मेरे पास इस प्रोग्राम के कई उदाहरण हैं, या अन्य प्रोग्राम भी लूप डिवाइस प्राप्त करने की कोशिश कर रहे हैं, तो प्रत्येक प्रक्रिया अगले एक कॉल से पहले लूप डिवाइस को आवंटित करने में सक्षम नहीं हो सकती है losetup -f
, इस स्थिति में दोनों प्रक्रियाएं सोचेंगी कि एक ही लूप डिवाइस उपलब्ध है, लेकिन केवल एक ही इसे प्राप्त कर सकता है।
मैं इसके लिए बाहरी सिंक्रनाइज़ेशन का उपयोग कर सकता था, लेकिन मैं (यदि संभव हो तो) अतिरिक्त जटिलता से बचना चाहूंगा। इसके अलावा, अन्य प्रोग्राम जो लूप डिवाइस का उपयोग करते हैं, वे संभवत: उस समस्या का सम्मान नहीं करेंगे जो मेरे साथ आ सकती है।
मैं इस संभावित दौड़ की स्थिति से कैसे बच सकता हूं? आदर्श रूप से, मैं लूप डिवाइस को एटोमिक रूप से खोज और बाँधने में सक्षम होना चाहता हूँ, उदाहरण के लिए जैसे कमांड:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
हालांकि, जब मैं ऐसा $ld
करता हूं, तो लूप डिवाइस पथ को असाइन नहीं किया जाता है, और अनुमति त्रुटियों के sudo
रूप में, बाहर निकल रहा है sudo ld=$(losetup -f myfile.img)
।
</dev/tty
लिए है?