मैं क्रॉन को हर दूसरे दिन एक कमांड चलाने के लिए कैसे कह सकता हूं (विषम / भी)


45

"डे ऑफ मंथ" फ़ील्ड का उपयोग करते हुए हर दूसरे दिन कमांड चलाने के लिए क्रोन को कॉन्फ़िगर करना, जैसे:

1 22 */2 * * COMMAND

यह हर बार महीने के दिन विषम: 1,3,5,7,9 और इतने पर चलता है।

मैं उस महीने के दिनों में चलाने के लिए क्रोन को कैसे कॉन्फ़िगर कर सकता हूं जो 2,6,8,10 और इसी तरह के हैं (बिना इसे अक्षरशः निर्दिष्ट किए, जो समस्याग्रस्त है क्योंकि हर महीने महीने में अलग-अलग दिनों में होता है)?

जवाबों:


60

आपके द्वारा रचित वाक्य-विन्यास वास्तव में अस्पष्ट है। महीने में कितने दिन होते हैं, इसके आधार पर कुछ महीने विषम दिनों में और कुछ पर भी चलेंगे। इसका कारण यह है कि जिस तरह से गणना की जाती है वह कुल संख्या को सकारात्मकता से लेती है और उन्हें विभाजित करती है। आप मैन्युअल रूप से दिन की सीमा को निर्दिष्ट करके या विषम या सम दिनों की संख्या का उपयोग करके इस आवेश-ईश व्यवहार को ओवर-राइड कर सकते हैं। चूँकि दिन की लिपियाँ अब और महीनों के 31 वें दिन तक नहीं चलेंगी, इसलिए आप 30 दिनों का उपयोग करते हुए आधार के रूप में भी कुछ भी ढीला न करें, और विशेष रूप से इसे विभाजित करने के लिए निर्दिष्ट करके, जैसे कि 31 दिन थे, जब आप अजीब कर सकते हैं -दिन का निष्पादन।

वाक्य विन्यास इस तरह दिखेगा:

# Will only run on odd days:
0 0 1-31/2 * * command

# Will only run on even days:
0 0 2-30/2 * * command

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

इस दृष्टिकोण के लिए एकमात्र 'गोच' यह है कि यदि आप एक विषम दिन चक्र पर हैं, तो 31 दिनों के बाद आपके कमांड भी महीने के पहले भाग पर चलेंगे। इसी तरह यदि आप एक समान चक्र के लिए मजबूर कर रहे हैं, तो प्रत्येक लीप वर्ष एक तीन दिन चक्र और फरवरी के अंत का कारण बनेगा। आप वास्तव में इस तथ्य के आसपास नहीं पहुंच सकते हैं कि "हर दूसरे दिन" का कोई भी नियमित पैटर्न हमेशा हर महीने में सम या विषम दिनों में गिरने वाला नहीं है और किसी भी तरह से आप इसे लागू करते हैं या तो आपके पास एक अतिरिक्त रन होगा या बीच में एक रन नहीं होगा। मिस-मैचेड दिन मायने रखता है।


1
धन्यवाद, लेकिन फरवरी जैसे महीनों में क्या होगा जहां आपके पास केवल 28 दिन हैं? तारा वास्तव में इसका ध्यान रखता है - लेकिन वास्तव में अस्पष्ट है।
फ़्रेडडी

3
@freddie: मेरा संपादित उत्तर देखें ... लेकिन यह एक गैर-मुद्दा है क्योंकि सीमा मूल्यों से बाहर केवल उपेक्षा की जाएगी, 30 या 31 फरवरी को कुछ भी नहीं होगा। कभी। आप मैन्युअल रूप से एक सूची के साथ निर्दिष्ट कर सकते हैं जैसे 0,2,4...,30,32,34और यह कोई फर्क नहीं पड़ता, रेंज मानों का बाहर बस कभी भी मिलान नहीं होगा।
कालेब

1
धन्यवाद! मैं समझता हूँ, जानकारीपूर्ण उत्तर के लिए धन्यवाद!
फ्रेड्डी

3
उबंटू सर्वर 8.04 पर, ऐसा लगता है कि दिन के शून्य का उपयोग करने वाला वाक्यविन्यास अमान्य है (खराब दिन का महीना)। हालाँकि, निम्नलिखित सिंटैक्स को स्वीकार किया जाता है:0 0 2-30/2 * * command

1
फेडोरा और आरएचईएल 5,6,7 भी महीने के एक दिन के रूप में 0 पसंद नहीं करते हैं। जैसा कि user31053 ने बताया: 0 0 2-30/2 * * commandउम्मीद के मुताबिक काम करता है।
NoelProf

2

मुझे लगता है कि एक संभावना वर्ष के दिन का उपयोग कर रही है, जैसे कि:

# for odd days
test $(((`date +%j` % 2))) != 0 && command

# for even days
test $(((`date +%j` % 2))) == 0 && command

यह यूनिक्स और लिनक्स सिस्टम के लिए परीक्षण किया गया है।


मैं इस जवाब को पसंद करता हूं क्योंकि यह कुछ महीनों के साथ विषम दिनों की समस्या को हल करता है। वैसे भी मैं सुझाव देता हूं कि डॉलर के नोटेशन के बजाय test $(($(date +%j) % 2)) == 0 && command
बैकटिक्स

मैंने समीक्षा की है कि% j जूलियन तारीख नहीं है, इसलिए नए साल के संक्रमण से बचने वाले सबसे अच्छे कोड को सेकंड के साथ गणना की जानी चाहिए:test $(($(date +%s) / 86400 % 2)) == 0 && command
कैलिगारी

टिप्पणियों के लिए धन्यवाद! हमारे प्रस्ताव ने हमारे लिए एक आकर्षण की तरह काम किया। हमने उस योजना का उपयोग विभिन्न सर्वर नोड्स पर हर दिन क्रोन चलाने के लिए किया, वे सभी एक ही क्रॉस्टब साझा करते हैं, लेकिन स्क्रिप्ट केवल उनमें से एक पर स्क्रिप्ट को चलाने की अनुमति देती है। हालांकि, अगर हमें इसे और अधिक विशिष्ट बनाने की आवश्यकता है, तो हम आपके प्रस्ताव पर विचार करेंगे। धन्यवाद!!!
जॉर्डन

1

अगर यह एक "अन्य" :-) ( bcकार्यक्रम आवश्यक है) तो हर दिन की जाँच करें

0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command

(मुझे यकीन नहीं है कि कोड सही ढंग से दिखाई देता है। date +%sहिस्सा बैक-एपोस्ट्रोफिस के बीच है।)


यह हर दूसरे दिन चलेगा लेकिन सवाल का जवाब नहीं देगा! यह अब भी कभी-कभी विषम दिनों में कभी-कभी महीने के आधार पर भी कभी-कभी चलता है। यह प्रश्न में कोड के समान परिणाम है, आप केवल युग के बाद से सेकंड पर अपना गणित करके परिणाम पर पहुंच रहे हैं। यह युगों से भी चलता है, लेकिन हमारे कैलेंडर के दिनों में भी नहीं।
कालेब

1

सामान्य तौर पर, मैं इसे हर दिन चलाता हूं और स्क्रिप्ट का उपयोग तर्क को निर्धारित करने के लिए करता है कि क्या इसे आज चलाया जाना चाहिए।

एक साधारण स्थिति फ़ाइल बता रही है जब अंतिम रन और फिर कम्पेयरिंग बहुत आसानी से काम करेगा।

यदि इसे विभिन्न स्रोतों के माध्यम से चलाने की आवश्यकता है, तो इसे तर्क-निर्भर बनाएं।

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