फ़ाइल खुला होना एक लॉक नहीं है क्योंकि, यदि प्रत्येक प्रक्रिया को जाँचना है कि फ़ाइल पहले खुली है या नहीं और आगे बढ़ना है या नहीं तो इसे खोलें / यदि यह नहीं है, तो दो प्रक्रियाएँ एक साथ बहुत अच्छी तरह से जाँच कर सकती हैं, दोनों मिल जाती हैं यह खुला नहीं है, तो दोनों इसे बनाएँ या खोलें।
किसी फ़ाइल को लॉक के रूप में उपयोग करने के लिए, चेक-एंड-लॉक ऑपरेशन को एक एकल निर्बाध संचालन होना चाहिए। आप इसे रीड-ओनली मोड के साथ फाइल बनाकर अनलॉक करने के लिए इसे हटाकर यूनिक्स फाइल सिस्टम में प्राप्त कर सकते हैं। यदि फ़ाइल मौजूद है (और केवल पढ़ने के लिए है) तो फ़ाइल निर्माण विफल हो जाएगा, इसलिए आपको एकल परमाणु ऑपरेशन में चेक-एंड-लॉक मिलता है।
यदि आपकी लॉकिंग प्रक्रिया एक शेल स्क्रिप्ट है जो डेमॉन के रूप में चल रही है, तो आप इस प्रभाव का उपयोग करके प्राप्त कर सकते हैं umask, एक प्रति-प्रक्रिया सेटिंग जो उन अनुमतियों को सेट करती है, जिनके साथ नई फाइलें बनाई जाती हैं:
oldumask = $ (umask)
umask 222 # मालिक के लिए भी अनावश्यक फ़ाइलें बनाएँ
यदि इको $ $> / var / लॉक / फू
फिर
: ताला लगाना सफल रहा
अन्य
: ताला लगाना विफल रहा
फाई
umask $ ओल्डमस्क
यह फ़ाइल में स्वयं की प्रक्रिया 'PID' भी लिखता है, जो आपकी अन्य समस्या को हल करता है:
cat /var/lock/foo
जैसा कि विशिष्ट प्रश्न "किस प्रक्रियाओं में यह फ़ाइल खुली है?" के संबंध में, यह तब उपयोगी हो सकता है जब आप किसी फ़ाइल सिस्टम को अनमाउंट करना चाहते हैं, लेकिन ऐसा नहीं कर सकते क्योंकि कुछ प्रक्रिया में फ़ाइल खुली है। यदि आपके पास वे कमांड उपलब्ध नहीं हैं, तो आप
/procरूट के रूप में पूछ सकते हैं :
ls -l /proc/*/cwd | grep '/var/lock/foo$'
या, एक नश्वर उपयोगकर्ता के रूप में:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'