हर दूसरे सप्ताह क्रोन के माध्यम से एक स्क्रिप्ट चलाएं


12

मैंने यह करने के लिए काफी शोध किया है, और मैं देखता हूं कि हर दूसरे गुरुवार को नौकरी चलाने के लिए क्रोन में कोई सीधा रास्ता नहीं है।

अभी, मैं एक स्क्रिप्ट बनाने की ओर झुक रहा हूं, जो हर हफ्ते चलेगी , और जब यह चलता है तो एक "ध्वज" फ़ाइल को स्पर्श करेगा, और यदि यह चलता है और फ़ाइल पहले से ही है, तो फ़ाइल को निकालने के लिए (और प्रदर्शन नहीं करना चाहिए) द्वि-साप्ताहिक कार्रवाई)।

मेरा सवाल यह है कि क्या हर दूसरे सप्ताह चलने वाली कार्रवाइयों की एक बश लिपि के इस लक्ष्य को पूरा करने के लिए कोई और अधिक सुरुचिपूर्ण या सरल तरीका है?

धन्यवाद!


1
एक ध्वज फ़ाइल के बजाय, आप आईएसओ सप्ताह संख्याओं का उपयोग कर सकते हैं। (उदा। स्ट्रैटेम का% V)।

@Roger: मुझे लगता है कि आप स्क्रिप्ट के भीतर एक सशर्त मतलब है।
अगली सूचना तक रोक दिया गया।

@ डेनिस: होना नहीं चाहिए (उदाहरण के लिए देखें कि स्क्रिप्ट के बाहर मेरा उत्तर कैसे जांचता है), लेकिन मेरा मुख्य बिंदु यह बहुत सरल होगा और फाइल सिस्टम में किसी भी राज्य की आवश्यकता नहीं है। हालांकि, मुझे एहसास हुआ कि महीने के चेकिंग डे के समान इसकी एक खामी है: कुछ वर्षों में 53 सप्ताह हैं और कुछ में 52 हैं।

जवाबों:


11
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

मैंने अपना गणित करने के लिए बैश का इस्तेमाल किया क्योंकि मैं आलसी हूं; जो भी आपको पसंद हो उस पर स्विच करें। मैं 1 जनवरी, 1970 का गुरुवार होने का लाभ उठाता हूं; सप्ताह के अन्य दिनों के लिए आपको एक ऑफसेट लागू करना होगा। क्रोन की जरूरत है प्रतिशत संकेत बच गए।

त्वरित जांच:

function check {
  when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
  echo -n "$when: "
  (($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}

for start in "2010-12-02" "2011-12-01"; do
  for x in $(seq 0 12); do
    check "$start + $(($x * 7)) days"
  done
  echo
done

ध्यान दें कि मैंने इसे दिखाने के लिए यादृच्छिक समय चुना है अगर यह गुरुवार को कभी भी चलेगा, और चुनी गई तिथियां जो वर्ष की सीमाओं को पार करती हैं, 4 और 5 दोनों गुरुवार के साथ महीने शामिल हैं।

आउटपुट:

Thu Dec  2 06:19:00 UTC 2010: run
Thu Dec  9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan  6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb  3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run

Thu Dec  1 21:40:00 UTC 2011: run
Thu Dec  8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan  5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb  2 17:37:00 UTC 2012: skip
Thu Feb  9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run

2
युग के बाद से सेकंड UTC में स्वाभाविक है, जबकि क्रोन स्थानीय समय में चलता है। यदि आपका सिस्टम टाइमज़ोन UTC नहीं है, तो इससे भ्रम पैदा होगा। ("यह क्यों नहीं चलता है? ओह, इसकी पहले से ही शुक्रवार UTC में")। दिन के उजाले की बचत के समय का अस्तित्व इस काम को और अधिक कठिन बना देता है (हालांकि असंभव नहीं है, क्योंकि आज तक आप वर्तमान यूटीसी
ऑफसेटों को

5

atयदि आप लिनक्स चला रहे हैं तो उपयोगिता का उपयोग करने का एक तरीका हो सकता है । आप इसे अपनी स्क्रिप्ट के अंत में रख सकते हैं:

at X + 2 weeks -f myscript

जहाँ X वह समय है जहाँ आप अपनी स्क्रिप्ट चलाना चाहते हैं। atजिस समय आप इसे पहली बार चलाना चाहते हैं, उसके लिए बस कॉल को इनिशियलाइज़ करने के लिए और फिर उपरोक्त स्टेटमेंट आपके निर्धारित कॉल को रिन्यू करता रहता है।


अगर यह एक दीर्घकालिक समाधान होने जा रहा है, तो मैं इसे चलाने की सिफारिश करूंगा, हालांकि मैं स्क्रिप्ट में एक फ़ंक्शन बनाऊंगा जो यह काम करेगा कि क्या इसे चलाने की आवश्यकता है
पॉल

3

यदि आप anacronसिस्टम पर उपयोग कर सकते हैं , तो चीजें बहुत सरल होंगी। उपयोग करने के लिए anacronआपको इसे स्थापित करना होगा और आपके पास रूट एक्सेस भी होना चाहिए। यह पुराने सिस्टम (यानी RHEL 5.x) पर काम नहीं करता है, एंकरन के पुराने संस्करण केवल बूट अप पर चलते हैं। यह नए सिस्टम (यानी RHEL 6.x) के साथ काम करता है।

इसके साथ anacron, व्यक्ति अधिक लचीले तरीके से नौकरियों का समय निर्धारित कर सकता है, जैसे सप्ताह में एक बार एक्स नौकरी चलाना। anacronजब कंप्यूटर उपलब्ध हो जाता है, तो नौकरियां भी चलाता है, यानी आपको सिस्टम या ऊपर होने पर विचार करने की आवश्यकता नहीं है।

प्रत्येक दूसरे सप्ताह में एक स्क्रिप्ट चलाने के लिए, आपको / etc / anacrontab का अनुसरण करने के लिए एक पंक्ति जोड़नी होगी:

14 5 myScript script.sh

विवरण के लिए मैन पेज देखें।


उपयोग करना anacronस्पष्ट रूप से सबसे साफ समाधान आईएमओ है (जब तक कि कुछ लोगों के लिए इसके कुछ अवांछित परिणाम न हों)।
JanC

0

मुझे यकीन नहीं है कि हर दूसरे सप्ताह को परिभाषित करने के लिए एक और अधिक सुंदर तरीका है, लेकिन यह आपके लिए काम कर सकता है।

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

यह महीने के पहले और तीसरे गुरुवार को सुबह 6:00 बजे स्क्रिप्ट लॉन्च करेगा।


2
यदि एक सप्ताह में तीन गुरुवार के साथ एक महीना होता है, तो यह एक सप्ताह में बंद हो जाएगा।
डेविड जेड

1
क्या कोई ऐसा महीना है जिसमें केवल 3 गुरुवार हों? हालाँकि मैं देख सकता हूँ कि यह एक सप्ताह है अगर 5 गुरुवार हैं। इसे अपडेट किया जा सकता है 1-7,15-21,29-31, लेकिन फिर यह बैक-टू-बैक चलेगा, अगर अंतिम सेट के लिए कोई मैच हो ...
20:25 पर

1
3 गुरुवार तक, क्या आपका मतलब 3 गुरुवार है कि स्क्रिप्ट चलेगी और 3 कुल गुरुवार नहीं है? मैंने इसे पहली बार गलत समझा हो सकता है।
pferate

0

मैं इसे हर हफ्ते चलाता हूं, और यह देखने के लिए स्क्रिप्ट की जांच करता हूं कि क्या सप्ताह संख्या एक विषम संख्या है: यदि हां बाहर निकलती है।

दिसंबर से जनवरी तक काम करने के लिए कुछ और सोच की जरूरत होगी।

शायद स्क्रिप्ट ने "अंतिम सफल रन" ध्वज फ़ाइल सेट की है। जब स्क्रिप्ट लॉन्च होती है, तो 14 दिन पहले ध्वज फाइल को अंतिम रूप से संशोधित करें।

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