2015-06-05 11 views
7

के साथ झुंड का उपयोग कर फ़ाइल लॉक करने में असमर्थ सबसे पहले मुझे दिखाएं कि क्या काम करता है। अगर मैं फ़ाइल पथ के साथ झुंड का उपयोग करता हूं, तो यह काम करता है।फाइल डिस्क्रिप्टर

टर्मिनल 1:

[[email protected] ~]# flock -x -n /tmp/foo.txt -c "sleep 100" 

टर्मिनल 2:

[[email protected] ~]# flock -x -n /tmp/foo.txt -c "sleep 100" 
[[email protected] ~]# echo $? 
1 

ऊपर उत्पादन पता चलता है कि मैं पहली बार पहला टर्मिनल में /tmp/foo.txt पर एक विशेष ताला हासिल। फिर दूसरे टर्मिनल में, जब मैं एक ही फाइल पर लॉक प्राप्त करने का प्रयास करता हूं, तो यह विफल हो जाता है।

अब मुझे बताएं कि काम नहीं करता है। अगर मैं फाइल डिस्क्रिप्टर के साथ झुंड का उपयोग करता हूं, तो यह काम नहीं करता है।

टर्मिनल 1:

[[email protected] ~]# { flock -x -n 100; sleep 100; } 100> /tmp/foo.txt 

टर्मिनल 2:

[[email protected] ~]# { flock -x -n 100; sleep 100; } 100> /tmp/foo.txt 

ऊपर उत्पादन पता चलता है कि मैं पहली बार पहला टर्मिनल में /tmp/foo.txt पर एक ताला प्राप्त करने के लिए प्रयास करें। फिर दूसरे टर्मिनल में, जब मैं एक ही फाइल पर लॉक प्राप्त करने का प्रयास करता हूं, तो यह सफल होता है। मुझे उम्मीद है कि यह पिछले उदाहरण की तरह असफल हो जाएगा। यह क्यों सफल होता है?

उत्तर

10

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

इसलिए आपको नीचे के झुंड के रिटर्न कोड पर निर्णय लेने की आवश्यकता है।

(flock -x -n 100 || exit 55; sleep 100;) 100> /tmp/foo.txt 

अब यदि आप उपरोक्त रेखा को एक टर्मिनल में निष्पादित करते हैं तो यह 100 सेकंड तक सो जाएगा। अगला यदि आप किसी अन्य टर्मिनल पर कोड चलाते हैं तो यह तुरंत संकेत पर वापस आ जाएगा। echo $? करें और आप देखेंगे कि यह 55 लौटा है क्योंकि हम || का उपयोग करके वापस लौटना चाहते हैं।

|| क्या छोटा सर्किटिंग है। यदि flock सामान्य निकास के रूप में 0 लौटाता है जो सत्य शैल के लिए मान है, तो यह अभिव्यक्ति के दाहिने हाथ को निष्पादित नहीं करेगा और इसलिए अगले कथन पर जाएगा। यदि रिटर्न वैल्यू 1 है जो शेल के लिए झूठी है, तो यह exit 55 और इसलिए बाहर निकलने के दाएं हाथ की अभिव्यक्ति का मूल्यांकन करना जारी रखेगा। आप इसे if-then-fi द्वारा भी कर सकते हैं।

यह भी ध्यान दें कि मैंने घुंघराले ब्रेसिज़ {} के बजाय ब्रैकेट () का उपयोग किया है। ऐसा इसलिए है क्योंकि, यदि आप कर्ली-ब्रेसिज़ का उपयोग करते हैं तो आदेश वर्तमान खोल में निष्पादित किए जाएंगे और यदि आप बाहर निकलने का उपयोग करते हैं, तो यह वर्तमान खोल से बाहर निकल जाएगा। एक ब्रैकेट एक सबहेल बनाएगा, इसलिए exit कर से वहां से सबहेल समाप्त हो जाता है और आपको अपने मूल खोल में वापस ले जाता है।

यह -c का उपयोग करके आपके पहले उदाहरण के लिए काम करता है क्योंकि आपके पास flock तर्क के भीतर संलग्न एकल आदेश है। इसलिए यदि flock लॉक प्राप्त करने में असमर्थ है तो यह केवल कथन निष्पादित नहीं करेगा और समाप्त नहीं होगा।

संबंधित मुद्दे