झुंड में झुंड और निष्पादन सुरक्षित है?


13

"स्टैंडर्ड" लॉकिंग स्निपेट जो मैंने देखा है वह कुछ इस तरह है ...

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

क्या execउस बिंदु पर उपयोग करना सुरक्षित है (परीक्षण ऐसा कहना लगता है) ? क्या सबप्रोसेस लॉक को बनाए रखेगा?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

मुझे याद है कि निष्पादक प्रक्रियाएं खुली फ़ाइल डिस्क्रिप्टर को बनाए रखती हैं और चूंकि झुंड फ़ाइल डिस्क्रिप्टर का उपयोग करता है इसलिए इसे काम करना चाहिए। लेकिन मुझे ऐसा कोई दस्तावेज नहीं मिला, जो इसे निश्चित और स्पष्ट बनाता हो।

रिकॉर्ड के लिए, यह लिनक्स के लिए विशिष्ट है।

जवाबों:


3

हां, तालों को संरक्षित किया जाता है exec। अंतर्निहित सिस्टम कॉल पर ताले संरक्षित हैं execve, जब तक कि फाइल डिस्क्रिप्टर खुला रहता है। फ़ाइल डिस्क्रिप्टर execveतब तक खुले रहते हैं जब तक कि उन्हें निष्पादन पर बंद करने के लिए कॉन्फ़िगर नहीं किया जाता है, और शेल पुनर्निर्देशन द्वारा बनाए गए फ़ाइल डिस्क्रिप्टर को क्लोज़-ऑन-एग्ज़िक्यूशन के रूप में चिह्नित नहीं किया जाता है।


6

हाँ यही है। Exec बस प्रक्रिया छवि को बदल देता है, लेकिन यह अभी भी एक ही प्रक्रिया है इसलिए इससे जुड़े OS- स्तर के ताले समान रहते हैं।

यह सत्यापित करना बहुत आसान है कि यह काम करता है:

ताला

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

लिपि

sleep 100

./lockअगले 100 सेकंड के भीतर दो बार दौड़ने का प्रयास करें । आपको केवल एक बार लॉक मिलेगा, एर्गो execलॉक को रिलीज़ नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.