19 अगस्त 2013 को, रैंडल एल। श्वार्ट्ज ने इस शेल स्क्रिप्ट को पोस्ट किया , जिसका उद्देश्य लिनक्स पर यह सुनिश्चित करना था, "कि [केवल] स्क्रिप्ट का एक ही उदाहरण चल रहा है, दौड़ की स्थिति के बिना या लॉक फ़ाइलों को साफ करने के लिए":
#!/bin/sh
# randal_l_schwartz_001.sh
(
if ! flock -n -x 0
then
echo "$$ cannot get flock"
exit 0
fi
echo "$$ start"
sleep 10 # for testing. put the real task here
echo "$$ end"
) < $0
यह विज्ञापन के रूप में काम करता है:
$ ./randal_l_schwartz_001.sh & ./randal_l_schwartz_001.sh
[1] 11863
11863 start
11864 cannot get flock
$ 11863 end
[1]+ Done ./randal_l_schwartz_001.sh
$
यहाँ मैं क्या समझता हूँ:
- स्क्रिप्ट
<
एक$0
उपधारा के STDIN (यानी फ़ाइल विवरणक0
) के लिए अपनी खुद की सामग्री (यानी से ) की एक प्रति ( ) की प्रतिलिपि बनाता है। - उपधारा के भीतर, स्क्रिप्ट
flock -n -x
फ़ाइल डिस्क्रिप्टर पर एक गैर-अवरोधक, अनन्य लॉक ( ) प्राप्त करने का प्रयास करती है0
।- यदि वह प्रयास विफल हो जाता है, तो सबस्क्रिप्शन बाहर निकल जाता है (और इसलिए मुख्य स्क्रिप्ट आती है, क्योंकि इसके लिए कुछ और नहीं है)।
- यदि इसके बजाय प्रयास सफल होता है, तो सबस्क्रिप्शन वांछित कार्य चलाता है।
यहाँ मेरे सवाल हैं:
- स्क्रिप्ट को पुनर्निर्देशित करने की आवश्यकता क्यों होती है, उपधारा द्वारा विरासत में मिली फाइल डिस्क्रिप्टर के लिए, अपनी सामग्री की प्रति , किसी अन्य फाइल की सामग्री के बजाय, कहती है? (मैंने एक अलग फ़ाइल से रीडायरेक्ट करने की कोशिश की और ऊपर के रूप में फिर से चल रहा है, और निष्पादन आदेश बदल गया: गैर-पृष्ठभूमि वाले कार्य ने पृष्ठभूमि एक से पहले लॉक प्राप्त किया। इसलिए, शायद फ़ाइल की अपनी सामग्री का उपयोग करने से दौड़ की स्थिति से बचा जाता है? लेकिन कैसे?)
- स्क्रिप्ट को फ़ाइल को पुनर्निर्देशित करने की आवश्यकता क्यों है, एक फाइल डिस्क्रिप्टर को जो सब-हेल्ड द्वारा विरासत में मिला है, एक फाइल की सामग्री की एक कॉपी, वैसे भी?
- फ़ाइल डिस्क्रिप्टर
0
पर एक शेल में एक विशेष लॉक रखने से एक ही स्क्रिप्ट की एक कॉपी को अलग शेल में चलने से रोकने के लिए फ़ाइल डिस्क्रिप्टर पर एक विशेष लॉक प्राप्त करने से रोकता है0
? गोले मानक फ़ाइल वर्णनकर्ता (के अपने, अलग प्रतियां नहीं है0
,1
है, और2
, यानी STDIN, STDOUT, और STDERR)?