2011-08-14 13 views
16

निम्नलिखित ताला तंत्र समवर्ती चलती से एक cron काम को रोकने के लिए प्रयोग किया जाता है:, पहले खत्म जब तकबैश झुंड: बाहर निकलें, तो प्राप्त नहीं कर सकते हैं ताला

#!/bin/bash 

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

जब दो उदाहरणों एक साथ चल रहा है, बाद में इंतजार करता है और फिर चलता है। यह चलाने के लिए प्रतीक्षा स्क्रिप्ट के बैकलॉग का कारण बन सकता है।

मैं इस स्क्रिप्ट को कैसे बदलूं ताकि flock लॉक प्राप्त नहीं कर सके, तो यह स्क्रिप्ट को समाप्त कर देता है? मैंने बिना सफलता के -n की कोशिश की है।

उत्तर

20
flock -n -e 200 || exit 1 

flock -n आपको बताता है कि यह एक विफलता कोड (शून्य के अलावा कुछ) वापस लौट कर विफल रहा है। जब आप किसी भी अनचेक त्रुटि को देखते हैं तो इसे बाहर निकालने के लिए आप अपनी स्क्रिप्ट के शीर्ष पर set -e कर सकते हैं।

आपके आवेदन के आधार पर, लॉक प्राप्त नहीं होने पर सफलता को इंगित करने के लिए आप exit 0 करना चाहेंगे।

12

हम स्क्रिप्ट फ़ाइल पर विशेष लॉक का उपयोग करते हैं, $0 कमांड फ़ाइल का नाम है।

exec 200<$0 
flock -n 200 || exit 1 

पूरा समाधान कोड की दो पंक्तियों में है। लेकिन चाल पढ़ने के लिए $ 0 खोलना है और फिर इसके लिए विशेष लॉक प्राप्त करना है।

+2

यह विफल होने पर मामलों को दस्तावेज करना अच्छा लगेगा। मुझे संदेह है कि अगर $ 0' में रिक्त स्थान हैं तो यह असफल हो जाएगा, और यह विफल हो जाएगा यदि '0 0' में चल रहे स्क्रिप्ट का पथ नहीं है (उदा। स्क्रिप्ट कहीं और है लेकिन 'पथ' पर)। – joeytwiddle

+0

$ 0 के पास अभी भी पथ होना चाहिए यदि यह $ PATH में है। एक मामला जहां यह काम नहीं करता है वह डैश के नीचे है। – steveayre

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

  • कोई संबंधित समस्या नहीं^_^