लिनक्स कमांड और शेल कौशल
बैश स्क्रिप्टिंग: 'मेरे बॉक्स पर काम करता है' से लेकर प्रोडक्शन तक
जब कोई कार्य गोंद पर होता है तो बैश अपना स्लॉट अर्जित करता है: ऑर्केस्ट्रेट कमांड, सरल टेक्स्ट को कम करना, और पूरी तरह से बॉक्स पर रहना। इसकी उद्योग प्रतिष्ठा लैंडिंग से आती है, न कि विचार से: अप्रयुक्त पाइपलाइनों को एक सर्वर पर क्रॉन में भेज दिया जाता है जहां एक चर अनसेट था या एक फ़ाइल नाम में जगह थी। अनुशासन यांत्रिक और सस्ता है, और इसके चार भाग हैं: सख्त मोड, उद्धरण, शेलचेक, और लॉगिंग जिस तरह से ऑप्स इसे बाद में पढ़ेंगे।
मुख्य बिंदु
- हर गंभीर स्क्रिप्ट set -euo Pipefail के साथ खुलती है: अनसेट वेरिएबल्स विफल हो जाते हैं, कमांड विफलताएं स्क्रिप्ट को रोक देती हैं, पाइपलाइन सतह पर रहती है; इसके बिना, त्रुटियां तब तक चुपचाप गुजरती रहती हैं जब तक वे उत्पादन तक नहीं पहुंच जातीं।
- उद्धरण चर और कमांड प्रतिस्थापन: "$var" और "$(cmd)"; रिक्त स्थान पर शब्द विभाजन सर्वकालिक क्लासिक है, और कुछ साइटों द्वारा अनुशंसित आईएफएस फ़िडलिंग एक बग है जिसे आप याद रखना चुन रहे हैं।
- ब्रेस का विस्तार वेरिएबल्स से पहले होता है: rm -rf "${CLEANUP:?}"/{a,b} CLEANUP unset के साथ इच्छित से अलग तरीके से फैलता है और उन चीजों को हटा देता है जिन्हें आप रखना चाहते थे; ${VAR:?} चेक आरएम-सुरक्षा मुहावरा है जो एक बार सीखने लायक है।
- शेलचेक प्रत्येक परिवर्तन पर अपना स्थान अर्जित करता है: यह गैर-उद्धृत ग्लब्स, पहुंच योग्य कोड और '$(ls) में f के लिए' पैटर्न को पकड़ता है जो रिक्त स्थान के साथ फ़ाइल नाम खाते हैं; इसे सीआई में चलाएं और बग क्रॉन तक पहुंचना बंद कर देंगे।
- अस्थायी कार्य और सफाई को जोड़ा गया है: TMP=$(mktemp -d), ट्रैप 'rm -rf "$TMP"' EXIT, और कोई अनाथ स्क्रैच डायर नहीं है और प्रत्येक शाखा पर कोई 'यदि त्रुटि है तो हटाएं' छिड़काव नहीं है।
- रीड लूप्स को सुरक्षित तरीके से पढ़ें: जबकि IFS= read -r -d '' f, find -print0 के माध्यम से नई लाइनों और रिक्त स्थान के साथ फ़ाइल नामों को संभालता है; 'for f in $(ls)' बग शेलचेक फ़्लैग और पुरानी स्क्रिप्ट अभी भी हर जगह मौजूद हैं।
- निकास कोड और लॉग ऑप्स से बात करते हैं: स्टेज नाम के साथ stderr (>&2) में इको विफलता, वास्तविक विफलता पर गैर-शून्य से बाहर निकलें, और क्रॉन के मेल या जर्नल को आपको वह एक लाइन दिखाने दें जो आपको वास्तव में सुबह 3 बजे चाहिए।
- जल्दी बढ़ाएं: JSON पार्सिंग, नेस्टिंग के तीन-प्लस स्तर, HTTP कॉल, या कोई भी स्टेटफुल लॉजिक पायथन या awk में है; बैश एक सामान्य-उद्देश्यीय भाषा में तब्दील हो गया है, जहां इसकी प्रतिष्ठा अर्जित की गई थी।
क्षेत्रीय टिप्पणी
हमारा ब्रेस-विस्तार निशान: rm -rf "${CLEANUP}"/{a,b} क्लीनअप अनसेट के साथ ठीक उसी तरह विस्तारित हुआ जिस तरह शेल, इरादा नहीं, चाहता था। इस तरह के प्रत्येक पथ पर अब ${VAR:?} गार्ड लगा हुआ है, और किसी ने भी उस बिल का दो बार भुगतान नहीं किया है।
अक्सर पूछे जाने वाले प्रश्न
#!/bin/bash या #!/usr/bin/env बैश?
env कंटेनरों में जीतता है और macOS इंस्टॉल करता है जहां बैश कहीं और रहता है; शेबैंग सेट-यूओ पाइपफ़ेल से कम मायने रखता है जो वास्तव में मौजूद है और हर बदलाव पर शेलचेक पास कर रहा है।
मेरी स्क्रिप्ट मैन्युअल रूप से काम करती है लेकिन क्रॉन में विफल रहती है। क्यों?
क्रोन एक नंगे वातावरण के साथ चलता है: PATH छोटा है, कोई लॉगिन प्रोफ़ाइल नहीं है, और सापेक्ष पथ गलत घर पर इंगित करते हैं। पूर्ण पथों का उपयोग करें, PATH को स्पष्ट रूप से सेट करें, और डिबगिंग के लिए bash -x replay रखें।
सर्वर कार्यों के लिए बैश या पायथन?
पाइपलाइनों के लिए बैश जो ज्यादातर मौजूदा सिस्टम टूल्स को व्यवस्थित करते हैं और छोटे रहते हैं; संरचित डेटा, एपीआई और त्रुटि प्रबंधन के लिए पायथन जिसे ऑन-कॉल जीवित रहना चाहिए। बैश को पायथन खेलने के लिए मजबूर करने से घटनाओं को नाम मिलते हैं।
मैं विलोपन को सुरक्षित रूप से कैसे स्क्रिप्ट कर सकता हूं?
प्रत्येक वेरिएबल को उद्धृत करें, केवल mktemp-निर्मित या स्पष्ट रूप से कॉन्फ़िगर किए गए पथों को लक्षित करें, ड्राई-रन मोड के साथ चलाएं जो प्रिंट करता है कि यह क्या हटा देगा, और $ {VAR:?} गार्ड वीटो को वेरिएबल्स को अनसेट करने दें इससे पहले कि rm उन्हें देखे।
लिनक्स कमांड और शेल कौशल में Kinetikatech कैसे सहायता करता है
सीधी बात: कमांड और स्क्रिप्टिंग आदतें जो यह तय करती हैं कि कोई व्यवस्थापक सर्वर चलाता है या उससे लड़ता है: प्रत्येक बेस इंस्टॉल में मौजूद टूल के साथ टेक्स्ट और प्रक्रियाओं को खोजना, बदलना, स्थानांतरित करना और पर्यवेक्षण करना। इसे हमारी Linux सर्वर सुरक्षा और सर्वर प्रबंधन सेवा को सौंप दें और काम पूरा — सही आकलन, स्वच्छ कार्यान्वयन, चौबीसों घंटे निगरानी।