राष्ट्रीय नेटवर्क सर्फिंग मी एक आला मनोरंजक लेख (जे मी येथे मजकूरपणे आणले आहे कारण ते कुशलतेने स्पष्ट केले आहे) जिथे लेखक आमच्या बश स्क्रिप्ट्सला अधिक मजबूत कसे बनवायचे हे दर्शविते. सापळे.
सापळ्यांसह आपल्या बॅश स्क्रिप्ट्स अधिक मजबूत करा
कल्पना करा की आपल्याकडे बॅश स्क्रिप्ट आहे जी दररोज दर सहा तासांनी चालते आणि काही वेळा ती क्रॅश होते किंवा तीच स्क्रिप्ट एकाच वेळी दोनदा चालते. या दोन घटनांमध्ये अस्वस्थता आहे कारण त्यांना मानवी हस्तक्षेप दुरुस्त करण्याची आवश्यकता आहे किंवा विशिष्ट वेळी त्यांचे समाधान केले जाऊ शकत नाही, ज्यामुळे सिस्टम विसंगत स्थितीत राहते. सापळा वापरणे हे इतरांमधील निराकरण आहे.
बॅश स्क्रिप्टचे आउटपुट नियंत्रित करण्यासाठी सापळे हा एक सोपा आणि प्रभावी मार्ग आहे. चला त्याच सुरुवातीच्या परिस्थितीकडे परत जाऊ या, जर स्क्रिप्ट स्वहस्ते थांबवले गेले असेल, उदाहरणार्थ ctrl-c सह, आउटपुट सिग्नल परत करताना व्यत्यय आला
INT
आणि जर ते संपेल
kill
तर आउटपुट असेल
TERM
.
सर्व संभाव्य निर्गम कोड सह पाहिले जाऊ शकतात
kill -l
तथापि सर्वात वापरलेले तंतोतंत आहेत
INT, TERM, बाहेर पडा
स्क्रिप्टमध्ये फाइल सिंक्रोनाइझेशनचे उदाहरणार्थ असल्यास
rsync
सर्वात समझदार गोष्ट म्हणजे लॉक फाइलवर अवलंबून राहणे जे स्क्रिप्टला एकाचवेळी चालण्याची परवानगी देत नाही:
LOCK = "/ var / run / rsync.lock" असल्यास [! -e $ लॉक]; नंतर स्पर्श करा $ LOCK rsync -avz foo बार rm $ LOCK अन्यथा "rsync आधीपासून चालू आहे" फाय
साध्या स्पॅनिशमध्ये वरील लिपी लॉक फाईल अस्तित्त्वात आहे किंवा नाही आणि ती अस्तित्वात नसेल तर ती तपासते आणि मग संबंधित कमांड कार्यान्वित करते आणि शेवटी लॉक फाईल डिलीट करते. फाईल अस्तित्वात असल्यास, स्क्रिप्ट वापरकर्त्यास कमांड आधीच पाठवित असल्याचे दर्शवते.
तथापि, समस्याप्रधान परिस्थिती उद्भवू शकते की लॉक फाइल हटविली जात नाही, अवांछित प्रभाव नष्ट करते. उपाय खूप सोपे आहे:
LOCK = "/ var / run / rsync.lock" असल्यास [! -e $ लॉक]; नंतर "आरएम -एफ OC लॉक; एग्जिट" ट्रॅप करा आयएनटी टर्म एक्झिट टच OC लॉक आरएससीएनएव्ही - एफओ बार बार आरएम OC लॉक ट्रॅप - आयएनटी टर्म एक्झिट अन्यथा "आरएससीएनसी आधीपासून चालू आहे"
या सोल्यूशनचे वैशिष्ट्य म्हणजे कमांड ट्रॅपमध्ये बंद आहे, जेणेकरुन जेव्हा सिग्नल प्राप्त होईल
INT, TERM, बाहेर पडा
स्क्रिप्ट थांबते आणि लॉक फाइल साफ करते.
लॉक फाईलची पडताळणी आणि ती तयार होण्याच्या वेळ दरम्यान वरील स्क्रिप्टमध्ये स्पर्धेची परिस्थिती असू शकते. एक संभाव्य उपाय म्हणजे रीडायरेक्ट आणि बॅशचा नॉकलोबर मोड वापरणे जे विद्यमान फाईलवर पुनर्निर्देशित होत नाही:
LOCK = "/ var / run / rsync.lock" if (सेट -o noclobber; इको $$> "OC लॉक") 2> / dev / शून्य; नंतर 'rm -f "OC LOCK" सापळा; बाहेर पडा $? ' INT TERM Exit rsync -avz foo बार rm -f OC लॉक ट्रॅप - इंट टर्म एक्झिट अन्यथा "आरएससीएनसी चालू आहे:: (मांजर $ एलसीके)" फाय
नंतरचे वैशिष्ट्य म्हणजे ते मी आधीपासून म्हटल्याप्रमाणेच वापरले जाते, नॉकलोबर मोड आणि लॉक फाइलमध्ये कार्यान्वित होणार्या प्रक्रियेचा पीआयडी असतो.
हे देखील उल्लेखनीय आहे की इतर निराकरणे देखील आहेत जसे की
flock
o
solo
तथापि या पोस्टमध्ये मला बॅशच्या स्वतःच्या संसाधनांसह निराकरणे सामायिक करायची आहेत. यासह ट्रॅप्सबद्दल आपण थोडेसे अधिक जाणून घेऊ शकता उत्कृष्ट मार्गदर्शक.
मस्त! सामायिक केल्याबद्दल धन्यवाद.
छान लेख, फक्त 'प्रतिध्वनी' बदलवा ryync आधीपासून चालू आहे: '(मांजर $ LCK) "" ते "echo" rsync आधीपासूनच कार्यरत आहे: $ (मांजर $ LOCK) "'
कोट सह उत्तर द्या
एक अतिशय मनोरंजक लेख, होय सर! हे मी ठेवतो.
लक्षात ठेवणे ही खूप उपयुक्त आज्ञा आहे. मी हे पोस्टमध्ये प्रकाशित केलेल्या स्क्रिप्टमध्ये वापरले होते, स्क्रिप्ट थांबविल्यावर तयार केलेल्या काही फायली हटविण्यासाठी.
खूप मनोरंजक, हो सर.