क्या कोई समझा सकता है कि फ़ाइल को लॉक करने और लॉक की गई फ़ाइल को लिखने के लिए झुंड और फ़ाइल डिस्क्रिप्टर का उपयोग कैसे करें?


14

मेरे साथ flockन तो मैं टूल में नया हूँ और जहाँ तक मुझे पता है मैंने फ़ाइल डिस्क्रिप्टर का उपयोग नहीं किया है।

मेरे पास एक bash स्क्रिप्ट है जो एक cURL अनुरोध करता है और आउटपुट को एक फ़ाइल में लिखता है resp.txt। मुझे एक विशेष लॉक बनाने की आवश्यकता है ताकि मैं उस फ़ाइल को लिख सकूं और एक ही समय में कई उपयोगकर्ताओं को स्क्रिप्ट चलाने और टेक्स्ट फ़ाइल को संपादित करने के बारे में चिंता न करें।

यहां वह कोड है जो मुझे फ़ाइल को लॉक करने, अनुरोध करने, और पाठ फ़ाइल पर लिखने की उम्मीद है:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

क्या इस बारे में जाने का यह सही तरीका है? मेरी वास्तविक स्क्रिप्ट इससे थोड़ी लंबी है, लेकिन जब मैं flockवाक्य रचना को बैश स्क्रिप्ट में जोड़ता हूं तो यह टूटने लगता है ।

अगर कोई समझा सकता है कि ये फाइल डिस्क्रिप्टर कैसे काम करते हैं और मुझे बताएं कि क्या मैं फाइल को सही तरीके से लॉक कर रहा हूं जो कि कमाल होगा!

जवाबों:


8

यह सही नहीं है क्योंकि जब आप करते हैं ( flock -e 200; ... ) 200> file, तो आप अनन्य लॉक प्राप्त करने file से पहले फ़ाइल को छोटा कर रहे हैं । मुझे लगता है कि आपको करना चाहिए:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

केवल पढ़ने के लिए खोली गई फ़ाइल पर लॉक लगाने के लिए।

ध्यान दें। कुछ गोले 9. से बड़े फ़ाइल डिस्क्रिप्टर का समर्थन नहीं करते हैं। इसके अलावा हार्डकोड फ़ाइल डिस्क्रिप्टर का पहले ही उपयोग किया जा सकता है। उन्नत गोले (बाश, ksh93, zsh) के साथ, निम्नलिखित किया जा सकता है:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)

मुझे जरूरत है कि कर्ल कमांड फाइल को लिखेगा। क्या मुझे गलतफहमी है कि कैसे flockकाम करता है? मैं फाइल डिस्क्रिप्टर में नया हूँ: /
डकपंचर

1
@DuckPuncher लॉक तंत्र उस रीड / राइट ऑपरेशन से अलग है जिसे आप फाइल पर कर सकते हैं। तो, curlअभी भी फ़ाइल में लिख सकते हैं। ध्यान दें कि यह NFS के साथ असुरक्षित हो सकता है (या काम भी नहीं कर सकता है), लेकिन NFS पर फ़ाइल लॉक करने के लिए शेल स्क्रिप्ट का उपयोग न करें। इसके साथ bash, आप फ़ाइल को पढ़ने और लिखने दोनों के लिए खोल सकते हैं: 200<> resp.txtलेकिन इससे कुछ भी नहीं बदलना चाहिए।
vinc17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.