2012-11-25 9 views
24

कि धागा के बारे में: bash flock: exit if can't acquire lockबैश झुंड: क्यों 200?

अगर किसी को क्या '200' करता है मुझे समझा सकता है मैं सराहना करता हूँ के लिए खड़े हैं।

मैंने झुंड के बारे में पढ़ा है और ऐसा लगता है कि 200 फ़ाइल डिस्क्रिप्टर निर्दिष्ट करने के लिए, लेकिन इस नंबर के बारे में इतना अच्छा क्या है?

+2

यह सिर्फ एक मनमाना फ़ाइल वर्णनकर्ता संख्या है। – Mat

उत्तर

33

संख्या 200 के बारे में कुछ खास नहीं है। यह flock कमांड के मैन पेज में उपयोग किया जाने वाला उदाहरण होता है; और यह एक बड़ी संख्या होती है, इसलिए आपकी स्क्रिप्ट के दौरान खोले गए किसी अन्य फ़ाइल के फ़ाइल डिस्क्रिप्टर के साथ संघर्ष करने की संभावना नहीं है।

अपनी टिप्पणी में, आप के बारे में पूछते हैं:

( 
    flock -e 200 
    echo "In critical section" 
    sleep 5 
) 200>/tmp/blah.lockfile 
echo "After critical section" 

कोष्ठकों () एक subshell बनाएँ; एक नई प्रक्रिया, माता-पिता प्रक्रिया से अलग है। 200>/tmp/blah.lockfile उस प्रक्रिया को /tmp/blah.lockfile को फ़ाइल डिस्क्रिप्टर 200 पर लिखने के लिए खोलने का कारण बनता है। कोष्ठक के अंदर के आदेश उस खोल के भीतर निष्पादित किए जाते हैं।

flock -e 200 फ़ाइल डिस्क्रिप्टर 200 द्वारा इंगित फ़ाइल पर एक विशेष लॉक प्राप्त करता है। एक विशेष लॉक का अर्थ है कि कोई भी व्यक्ति जो उस फ़ाइल पर लॉक प्राप्त करने का प्रयास करता है, या तो अनन्य या साझा किया जाता है, इस लॉक तक ब्लॉक (प्रतीक्षा) करेगा छोड़ा गया, या विफल हो गया अगर वे एक टाइमआउट मारा या ब्लॉक करने के लिए कहा। तो सबहेल के शरीर के शेष (echo और sleep कमांड) के दौरान, लॉक उस सबहेल द्वारा आयोजित किया जाएगा, और कोई भी उस लॉक को प्राप्त नहीं कर सकता है। एक बार सबहेल खत्म होने के बाद, फ़ाइल बंद हो जाएगी और बंद कर दिया जाएगा।

+0

धन्यवाद। मैं स्क्रिप्टिंग को बाश करने के लिए नया हूं, क्या आप कृपया मुझे शेष कोड समझा सकते हैं: '( झुंड-200 20 गूंज" महत्वपूर्ण खंड में " नींद 5 ) 200> /tmp/blah.lockfile गूंज" महत्वपूर्ण खंड के बाद "' – Subway

+0

@ राफर ने यह जवाब देने के लिए अपना जवाब संपादित किया कि यह कैसे काम करता है। –

+0

धन्यवाद! एक बात है जिसे मैं समझ नहीं पा रहा हूं, यद्यपि। सबहेल क्यों आवश्यक है? क्यों कोड निष्पादित करने से पहले लॉक न लें और कोड निष्पादन समाप्त होने के बाद इसे जाने दें? – Subway