राष्ट्रीय नेटवर्क सर्फिंग मैं एक भर में आया था दिलचस्प आलेख (जो मैं यहाँ पर पाठयक्रम में लाता हूँ क्योंकि यह बड़ी सरलता से समझाया गया है) जहाँ इसका लेखक हमें दिखाता है कि कैसे हमारी बैश लिपियों का उपयोग करके अधिक मजबूत बनाया जा सकता है जाल.
जाल के साथ अपनी बैश लिपियों को और अधिक मजबूत बनाएं
कल्पना कीजिए कि आपके पास एक बैश स्क्रिप्ट है जो हर छह घंटे में हर दिन चलती है और किसी समय यह विफल हो जाती है या एक ही स्क्रिप्ट दो बार एक साथ चलती है। ये दो स्थितियाँ काफी असहज होती हैं क्योंकि उन्हें मानवीय हस्तक्षेप को ठीक करने की आवश्यकता होती है या निश्चित समय पर उन्हें संबोधित नहीं किया जा सकता है, सिस्टम को असंगत स्थिति में छोड़ देता है। इसका समाधान, दूसरों के बीच, जाल का उपयोग करना है।
बैश स्क्रिप्ट के आउटपुट को नियंत्रित करने के लिए जाल एक सरल और प्रभावी तरीका है। चलो उसी प्रारंभिक स्थिति में वापस जाते हैं, यदि स्क्रिप्ट मैन्युअल रूप से बंद हो जाती है, उदाहरण के लिए ctrl-c के साथ, यह सिग्नल को वापस करने में बाधित है
INT
और अगर इसके साथ समाप्त होता है
kill
तब आउटपुट होगा
TERM
.
सभी संभव निकास कोड के साथ देखा जा सकता है
kill -l
हालांकि सबसे अधिक इस्तेमाल किया जाता है
INT, अवधि, परीक्षा
यदि स्क्रिप्ट में है, उदाहरण के लिए, के साथ फ़ाइलों को सिंक्रनाइज़ करना
rsync
सबसे समझदार बात यह है कि एक लॉक फ़ाइल पर भरोसा करना जो स्क्रिप्ट को एक साथ चलने की अनुमति नहीं देता है:
LOCK = "/ var / run / rsync.lock" यदि [! -य $ LOCK]; तब $ LOCK rsync -avz foo बार rm $ LOCK को स्पर्श करें बाकी गूंज "rsync पहले से ही" फाई चल रहा है
सादे स्पैनिश में, पिछली स्क्रिप्ट जाँचती है कि क्या लॉक फ़ाइल मौजूद है और यदि यह मौजूद नहीं है, तो यह इसे बनाता है और बाद में संबंधित कमांड को निष्पादित करता है, अंत में लॉक फ़ाइल को हटा रहा है। यदि फ़ाइल मौजूद है, तो स्क्रिप्ट केवल उपयोगकर्ता को एक संदेश भेजती है जो यह संकेत देती है कि कमांड पहले से ही चल रहा है।
हालाँकि जब कोई समस्याग्रस्त स्थिति होती है तो ऐसा हो सकता है कि लॉक फ़ाइल को समाप्त नहीं किया जाता है, जिससे अवांछित प्रभाव नष्ट हो जाते हैं। समाधान बहुत सरल है:
LOCK = "/ var / run / rsync.lock" यदि [! -य $ LOCK]; तब जाल "rm -f $ LOCK; बाहर निकलें" INT TERM EXIT स्पर्श $ LOCK rsync -avz foo bar rm $ LOCK जाल - INT TERM EXIT बाकी गूंज "rsync पहले से ही चल रहा है: Fi
इस समाधान की ख़ासियत यह है कि कमांड एक जाल में संलग्न है, ताकि जब एक संकेत प्राप्त हो
INT, अवधि, परीक्षा
स्क्रिप्ट बंद हो जाती है और लॉक फ़ाइल को साफ़ करती है।
यह कहने योग्य है कि लॉक फ़ाइल को सत्यापित करने और इसे बनाने के समय के बीच उपरोक्त स्क्रिप्ट में एक प्रतिस्पर्धा की स्थिति हो सकती है। एक संभव समाधान एक पुनर्निर्देशित और बैश के नोकलोब मोड का उपयोग करना होगा जो किसी मौजूदा फ़ाइल को पुनर्निर्देशित नहीं करता है:
LOCK = "/ var / run / rsync.lock" यदि (सेट-noclobber; गूंज $ $> "$ LOCK") 2> / dev / null; फिर 'rm -f "$ LOCK"; बाहर निकलें $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK ट्रैप - INT TERM EXIT बाकी गूंज "rsync पहले से चल रहा है: $ (कैट $ LCK)" फाई
उत्तरार्द्ध की ख़ासियत यह है कि इसका उपयोग किया जाता है जैसा कि मैंने पहले ही कहा था, नोकलोबार मोड और लॉक फ़ाइल में उस प्रक्रिया का पीआईडी होता है जिसे निष्पादित किया जा रहा है।
यह भी ध्यान देने योग्य है कि अन्य समाधान भी हैं जैसे कि
flock
o
solo
हालाँकि इस पोस्ट में मैं अपने स्वयं के संसाधनों के साथ समाधान साझा करना चाहता था। आप इसके साथ ट्रैप के बारे में थोड़ा और जान सकते हैं उत्कृष्ट मार्गदर्शक.
प्रतिभाशाली! साझा करने के लिए धन्यवाद।
अच्छा लेख, बस 'इको "rsync को बदल दें
सादर
एक बहुत ही रोचक लेख, हाँ सर! यह मैं रखता हूं।
यह ध्यान में रखने के लिए एक बहुत ही उपयोगी कमांड है। मैंने इसका उपयोग एक स्क्रिप्ट में किया था जिसे मैंने एक पोस्ट में प्रकाशित किया था, कुछ फ़ाइलों को हटाने के लिए जो स्क्रिप्ट तब बनाई गई जब इसे रोक दिया गया था।
बहुत दिलचस्प, हाँ सर।