सार
सही कोड होना चाहिए:
#!/bin/sh
[ "$#" -eq 0 ] && echo "Usage: $0 command [args]" && exit 1
[ "$(date -d tomorrow +'%d')" = 01 ] || exit 0
exec "$@"
इस स्क्रिप्ट end_of_month.sh
को कॉल करें और क्रोन में कॉल बस है:
00 12 28-31 * * /path/to/script/end_of_month.sh command
वह स्क्रिप्ट चलाएगा end_of_month
(जो आंतरिक रूप से जांच करेगा कि दिन महीने का अंतिम दिन है) केवल 28, 29, 30 और 31 के दिन। किसी भी अन्य दिन महीने के अंत की जांच करने की कोई आवश्यकता नहीं है।
पुरानी पोस्ट।
वह रिचर्ड ब्लम, क्रिस्टीन ब्रेस्नाप पीपी 442, तृतीय संस्करण, जॉन विले एंड संस © 2015 की पुस्तक "लिनक्स कमांड लाइन और शेल स्क्रिप्टिंग बाइबिल" से एक उद्धरण है।
हां, यह वही है जो यह कहता है, लेकिन यह गलत / अधूरा है:
- एक समापन याद आ रहा है
fi
।
[
निम्न और निम्न के बीच स्थान की आवश्यकता है `
।
- इसके बजाय $ (…) का उपयोग करने की दृढ़ता से अनुशंसा की जाती है
`…`
।
- यह महत्वपूर्ण है कि आप विस्तार जैसे उद्धरणों का उपयोग करें
"$(…)"
- के
;
बाद एक अतिरिक्त हैthen
मुझे कैसे पता चलेगा? (ठीक है, अनुभव ☺ द्वारा) लेकिन आप शेलचेक की कोशिश कर सकते हैं । पुस्तक से कोड (तारांकन के बाद) पेस्ट करें और यह आपको ऊपर सूचीबद्ध त्रुटियों को दिखाएगा जो एक "लापता शेबंग" है। शेलचेक में किसी भी त्रुटि के बिना एक स्क्रिप्ट यह है:
#!/bin/sh
if [ "$(date +%d -d tomorrow)" = 01 ] ; then script.sh; fi
वह साइट काम करती है क्योंकि जो लिखा गया था वह "शेल कोड" है। यह एक सिंटैक्स है जो कई गोले में काम करता है।
शेलचेक का उल्लेख नहीं करने वाले कुछ मुद्दे हैं:
यह मानकर चल रहा है कि दिनांक आदेश GNU दिनांक संस्करण है। -d
उस विकल्प के साथ जो मान के tomorrow
रूप में स्वीकार करता है (बिजीबॉक्स के पास -d विकल्प होता है, लेकिन कल नहीं समझ में आता है और BSD के पास एक -d
विकल्प है लेकिन समय के "प्रदर्शन" से संबंधित नहीं है)।
सभी विकल्पों के बाद प्रारूप को सेट करना बेहतर है date -d tomorrow +'%d'
।
क्रोन प्रारंभ समय हमेशा स्थानीय समय में होता है, जो कि एक दिन की गणना की तुलना में 1 घंटे पहले एक नौकरी शुरू कर सकता है यदि डीएसटी (दिन के समय की बचत का समय) सेट हो गया या परेशान हो गया।
हमने जो किया वह एक शेल स्क्रिप्ट है जिसे क्रोन के साथ कहा जा सकता है। हम इस तरह (अंत में, सही कोड) निष्पादित करने के लिए प्रोग्राम या कमांड के तर्कों को स्वीकार करने के लिए स्क्रिप्ट को संशोधित कर सकते हैं:
#!/bin/sh
[ "$#" -eq 0 ] && echo "Usage: $0 command [args]" && exit 1
[ "$(date -d tomorrow +'%d')" = 01 ] || exit 0
exec "$@"
इस स्क्रिप्ट end_of_month.sh
को कॉल करें और क्रोन में कॉल बस है:
00 12 28-31 * * /path/to/script/end_of_month.sh command
वह स्क्रिप्ट चलाएगा end_of_month
(जो आंतरिक रूप से जांच करेगा कि दिन महीने का अंतिम दिन है) केवल 28, 29, 30 और 31 के दिन। किसी भी अन्य दिन महीने के अंत की जांच करने की कोई आवश्यकता नहीं है।
सुनिश्चित करें कि सही मार्ग शामिल है। CAT के अंदर PATH उपयोगकर्ता PATH के समान नहीं होगा (संभावना नहीं है)।
ध्यान दें कि महीने की स्क्रिप्ट के एक छोर का परीक्षण किया गया है (जैसा कि नीचे बताया गया है) जो कई अन्य उपयोगिताओं या स्क्रिप्ट को कॉल कर सकता है।
यह अतिरिक्त समस्या से भी बचाएगा, जो क्रोन पूरी कमांड लाइन के साथ उत्पन्न होती है:
- क्रोन कमांड लाइन को किसी पर भी विभाजित करता है,
%
भले ही या तो ( '
या "
केवल \
यहां काम करता है) के साथ उद्धृत किया गया हो । यह एक सामान्य तरीका है जिसमें क्रोन नौकरियां विफल होती हैं।
यदि end_of_month.sh
स्क्रिप्ट कुछ तारीखों पर सही ढंग से काम करती है (बिना काम किए इसे पूरा करने के लिए महीने के अंत तक प्रतीक्षा करें तो आप इसे देख सकते हैं)
$ faketime 2018/10/31 ./end_of_month echo "Command will be executed...."
Command will be executed....