बैश में एक फ़ाइल में परमाणु लेखन कार्य करना


13

बैश डॉक्यूमेंटेशन के माध्यम से जाने के बाद , यह सवाल और यह अभी भी मेरे लिए स्पष्ट नहीं है कि मैं कैसे बैश में एक फाइल में एटॉमिक राइट (एपेंड) ऑपरेशन कर सकता हूं। मेरे पास एक स्क्रिप्ट है जो कई उदाहरणों में चलती है और कुछ बिंदु पर फ़ाइल में डेटा लिखना चाहिए:

echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE

यह संभव है कि सभी समवर्ती चलने वाली लिपियों से उस फ़ाइल परमाणु तक सभी लेखन संचालन कैसे करें (ताकि एक उदाहरण से डेटा दूसरे से डेटा ओवरलैप न हो)?


1
FYI करें आपको ज़रूरत नहीं है `pwd`; आप बस एक डॉट ( .) का उपयोग कर सकते हैं । इसके अलावा आपको उस पूरे फ़ाइल नाम को उद्धृत करना चाहिए क्योंकि इसमें चर शामिल हैं
वाइल्डकार्ड

1
आप एफआईएफओ का उपयोग करने की संभावना पर भी गौर कर सकते हैं ।
वाइल्डकार्ड

@Wildcard धन्यवाद। मैं pwdउपयोगकर्ता के लिए वर्तमान कार्यशील निर्देशिका के बारे में सूचित करने के लिए स्क्रिप्ट में उपयोग कर रहा था और लॉग फ़ाइल में प्रविष्टियां भी लिख रहा था। अब FIFO देख रहे हैं।
सेबी

1
वास्तव में इस साइट पर FIFOs का बेहतर परिचय है ; कुछ मिनट पहले मैंने जो लिंक दिया था वह POSIX चश्मा है mkfifoऔर बिल्कुल परिचयात्मक स्तर का नहीं है।
वाइल्डकार्ड

चाहे वह एफआईएफओ हो या फाइल, आप अभी भी उस जोखिम को चलाते हैं जो दो उदाहरण एक ही समय में लिखते हैं और एक दूसरे के आउटपुट को गार्बल करते हैं।
क्लॅक

जवाबों:


10

ऐसा लगता है कि आपको flockमनुष्य से उदाहरण के रूप में उपयोग करने की आवश्यकता है ( http://linux.die.net/man/1/flock )

(
flock -x 200

# Put here your commands that must do some writes atomically

) 200>/var/lock/mylockfile 

और अपने सभी आदेशों को परमाणु () में रखना चाहिए।


लिखने का संचालन भले ही परमाणु हो (झुंड -s 200 # यहां अपनी आज्ञाएं रखें जो कुछ भी लिखना चाहिए परमाणु से) 200> / var / lock / mylockfile कई समवर्ती चलने वाली लिपियों में फैला हुआ है? या, इसके विपरीत, लॉक केवल / var / लॉक / mylockfile के सापेक्ष है?
सेबी

1
आपकी स्क्रिप्ट लॉक / var / लॉक / mylockfile, लेकिन आपकी स्क्रिप्ट का केवल एक उदाहरण इस पर राइट लॉक प्राप्त कर सकता है। अन्य उदाहरण इंतजार करेंगे जब तक /var/lock/mylockfileकि लॉकिंग उपलब्ध न हो।

-s एक साझा लॉक है - रीड्स के लिए उपयुक्त, राइट लॉक के लिए आपको -x / -e का उपयोग करना चाहिए। यह आपके द्वारा लिंक किए गए मैन पेज में है।
इवान बेन

इस कोड में किस बिंदु पर अनलॉक होता है? जैसे ही कुछ /var/lock/mylockfileइस प्रक्रिया के द्वारा लिखा जाता है जिसे कहा जाता है flock -x?
क्रिस स्ट्राइकिनस्की

@ChrisStryczynski आप इस उदाहरण (flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfileको दो गोले में चला सकते हैं और देख सकते हैं कि अनलॉक सभी कमांड () में निष्पादित होने के बाद ही होता है (जो कि

4

flockइंटरलॉकिंग संचालन के तरीकों में से एक है। उपयोगिता उपयोग-लिनक्स टूलसेट का हिस्सा है और केवल लिनक्स के लिए उपलब्ध है। अन्य उपयोगिताओं, प्लेटफार्मों की एक विस्तृत श्रृंखला में उपलब्ध हैं, डैनियल जे। बर्नस्टीन की setlockउनके डेमोंटोल्स पैकेज से उपयोगिता के आसपास आधारित हैं :

  • setlock दमादमूल से
  • setlock ब्रूस गुएंटर के डेमोंटोल्स-एनकोर से
  • s6-setlock लॉरेंट बर्कोट के s6 से
  • chpst गेरिट पपी के रुनिट से
  • runlock वेन मार्शल की प्रति से
  • setlock मेरे nosh टूलसेट से

ये उपकरण एम। कुरेंकोव के उत्तर में इस्तेमाल किए जाने वाले एक भिन्न प्रतिमान के साथ काम करते हैं ( flockवह भी जो रोजगार दे सकता है, लेकिन उस उत्तर में नहीं है)। एक setlockप्रोग्राम को चेन लोड करने के लिए कमांड को इंटरलॉक करता है जिसे इंटरलॉक किया जाना चाहिए। setlockस्वयं लॉक फाइल को खोलता और बंद करता है, और इसके लिए एक फाइल डिस्क्रिप्टर छोड़ता है जो इसकी प्रक्रिया में खुला है। जब तक यह प्रक्रिया जारी रहती है तब तक लॉक बना रहता है (जब तक कि बाद की कमांड स्पष्ट रूप से खुली फाइल डिस्क्रिप्टर को खोजने और बंद करने से लॉक जारी नहीं करती)।

प्रश्न में मामले के लिए किसी को कमांड को इंटरलॉक करना होगा जो आउटपुट लाइन का उत्पादन करता है, यह जानते हुए कि यह शेल निर्मित कमांड के स्थान पर बाहरी echo को आमंत्रित करता है echo:

mylockfile प्रतिध्वनि "$ परिणाम" >> ./TTEMP_DIR/$OUT_FILE सेट करें

इस मामले में एपेंड मोड में आउटपुट फाइल को इंटरलॉक करना आवश्यक नहीं है। यदि ऐसा होता है, तो किसी को उस फ़ाइल को लॉक के भीतर खोलना होगा, जिसे fdredir/ जैसे कार्यक्रमों का उपयोग करने की आवश्यकता होती है redirfd:

mylockfile fdredir --append 1 को सेट करें। "//TEMP_DIR/OSOUT_FILE" $ परिणाम "प्रतिध्वनि"
अगर कोई चाहे तो शेल फंक्शन में बदल सकता है:

outfile () {सेटलॉक मायलॉकफाइल fdredir --append 1 "./>TEMP_DIR/$OUT_FILE" "$ @"; } 
[…]
आउटफिट गूंज "$ परिणाम"
या शेल सिंटैक्स के साथ चिपके रहना और इंटरलॉक के तहत चल रहे एक दूसरे शेल द्वारा इसकी व्याख्या करना, कुछ गैर-तुच्छ उद्धरण की आवश्यकता होती है यदि किसी के शेल चर को पर्यावरण चर के रूप में निर्यात नहीं किया जाता है:

mylockfile shc -c 'echo' "$ RESULT" '>> "को सेट करें।" /' ORTEMP_DIR'/'OSOUT_FILE '"'

यह निश्चित रूप से आउटपुट फ़ाइलों को लिखने के अलावा अन्य चीजों के लिए सामान्यीकृत करता है:

झुंड mylockfile sh -c '... इंटरलॉक किया गया; सामान ... '

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