क्या हर तीन दिन में क्रोनजॉब चलाना संभव है ? या शायद 10 गुना / महीना।
क्या हर तीन दिन में क्रोनजॉब चलाना संभव है ? या शायद 10 गुना / महीना।
जवाबों:
इसे हर तीन दिन में चलाएं ...
0 0 */3 * *
उस के बारे में कैसा है?
यदि आप चाहते हैं कि यह महीने के विशिष्ट दिनों में चलें, जैसे कि 1, 4, 7 वां, आदि ... तो आप बस अपनी स्क्रिप्ट में एक शर्त रख सकते हैं जो महीने के वर्तमान दिन की जाँच करता है।
if (((date('j') - 1) % 3))
exit();
या, जैसा कि @mario बताते हैं, आप महीने के दिन के आधार पर वर्ष के दिन को प्राप्त करने के लिए दिनांक ('k') का उपयोग कर सकते हैं।
0 0 */3 * *साधन 1, 4, 7, आदि (पर चलने */3का मतलब है 1-31/3इसका मतलब है 1,4,7...31) तो खाई महीने के अंत में छोटा होगा। (यह पंक्ति में 2 दिन चलेगा अगर पिछले महीने में 31 दिन थे।) date('j') % 3इसमें एक समान समस्या है कि पैटर्न हर साल फिर से शुरू होता है, और वर्षों में 3. द्वारा विभाज्य दिनों की संख्या नहीं होती है
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
मैं एक क्रॉन विशेषज्ञ नहीं हूं, लेकिन इसके बारे में कैसे:
0 */72 * * *
यह हर 72 घंटे में बिना रुके चलेगा।
then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
क्योंकि क्रोन "स्टेटलेस" है, यह "आवृत्तियों" को सही ढंग से व्यक्त नहीं कर सकता है, केवल "पैटर्न" जो यह (जाहिरा तौर पर) वर्तमान समय के खिलाफ लगातार मेल खाता है।
आपके प्रश्न को रीफ़्रेश करने से यह और अधिक स्पष्ट हो जाता है: "क्या हर रात 00:01 बजे एक क्रोनजॉब चलाना संभव है सिवाय रातों को छोड़कर जब वह 2 रातों के भीतर चला था?" जब क्रोन वर्तमान समय की तुलना नौकरी के अनुरोध के समय के पैटर्न से कर रहा है, तो कोई तरीका नहीं है कि क्रॉन को पता चल सके कि क्या यह आपके अतीत में काम करता है।
आमतौर पर आपको उस आवर्ती घटना को समाप्त करना होगा और पूरी तरह से नया शुरू करना होगा; यह इस बात की सीमित अभिव्यक्ति को दर्शाता है कि कैसे जटिल कैलेंडर एप्लिकेशन भी दोहराए जाने वाले पैटर्न का प्रतिनिधित्व करते हैं। और निश्चित रूप से कैलेंडर्स के पास बहुत अधिक राज्य हैं - प्रत्येक व्यक्तिगत घटना को स्वतंत्र रूप से हटाया जा सकता है या [ज्यादातर कैलेंडर ऐप्स में] पुनर्निर्धारित किया जा सकता है।)
इसके अलावा, आप शायद हर 3 रात में अपना काम करना चाहते हैं यदि सफल हो , लेकिन अगर आखिरी बार असफल हो गए, तो तुरंत फिर से प्रयास करने के लिए, शायद अगली रात (3 दिन और इंतजार न करें) या फिर जल्द ही, एक घंटे बाद की तरह (लेकिन फिर से प्रयास करना बंद करें) सुबह के आगमन पर)। स्पष्ट रूप से, क्रोन संभवतः यह नहीं जान सकता है कि आपकी नौकरी सफल हुई और पैटर्न वैकल्पिक रूप से अधिक "रिट्री" शेड्यूल को भी व्यक्त नहीं कर सकता है।
वैसे भी - आप वही कर सकते हैं जो आप खुद चाहते हैं। एक स्क्रिप्ट लिखें, क्रॉन को इसे रात को 00:01 बजे चलाने के लिए कहें। यह स्क्रिप्ट किसी चीज़ की टाइमस्टैम्प की जांच कर सकती है * जो "अंतिम रन" को रिकॉर्ड करती है, और अगर यह 3 दिन पहले ** था, तो कार्य निष्पादित करें और "अंतिम रन" टाइमस्टैम्प को रीसेट करें।
(* वह टाइमस्टैम्पड इंडिकेटर एक ज़बरदस्त अवस्था है जिसे आप हेरफेर और जांच कर सकते हैं, लेकिन कौन सा क्रोन नहीं कर सकता है)
** यदि आप मानव पठनीय घड़ी समय का उपयोग कर रहे हैं तो अंकगणित से सावधान रहें - वर्ष में दो बार, कुछ दिनों में उनके दिन में 23 या 25 घंटे होते हैं, और 02: 00-02: 59 एक दिन में दो बार होता है या नहीं सब। इससे बचने के लिए यूटीसी का इस्तेमाल करें।
0 0 1-30/3 * *
यह 1 से शुरू होने वाले हर तीन दिन चलेगा। यहां 20 निर्धारित रन हैं -
मुझे नहीं लगता है कि आपके पास क्या है:
0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!
दुर्भाग्य से, * / 3 पर अंतराल सेट कर रहा है हर महीने के n दिन और नहीं प्रत्येक n दिनों । देखें: विवरण यहाँ । महीने के अंत में आवर्ती मुद्दे की गारंटी है।
1st at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...
इस लेख के अनुसार , आपको TRUE "हर N दिन" प्राप्त करने के लिए निष्पादित किए जा रहे कुछ modulo गणित को जोड़ने की आवश्यकता है। उदाहरण के लिए:
0 0 * * * bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh
इस उदाहरण में, नौकरी को रोज़ाना 12:00 पूर्वाह्न पर चेक किया जाएगा, लेकिन केवल तभी निष्पादित किया जाएगा जब 01-01-1970 के बाद के दिनों की संख्या 3 हो।
यदि आप चाहते हैं कि यह विशिष्ट तिथि से हर 3 दिन में हो, तो निम्न प्रारूप का उपयोग करें:
0 0 * * * bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
कैसा रहेगा:
00 00 * * * every 3 days && echo test
everyएक स्क्रिप्ट कहां है:
#!/bin/sh
case $2 in
days)
expr `date +%j` % $1 = 0 > /dev/null
;;
weeks)
expr `date +%V` % $1 = 0 > /dev/null
;;
months)
expr `date +%m` % $1 = 0 > /dev/null
;;
esac
इसलिए यह हर दिन चलता है।
*/33, 6, ... 27 वें, 30 वें महीने पर रन का उपयोग करना , लेकिन एक महीने के 31 वें दिन के बाद फिर गलत है। everyस्क्रिप्ट साल के अंत के बाद ही गलत है।
आपको मूल बातें सीखनी चाहिए crontab।
संपादन आदेश द्वारा क्रॉन crontab -eऔर फिर ⌃ (CTRL)+ Xतो Yऔर अंत में प्रेस ENTER (return)मैक पर फ़ाइल को बचाने के लिए। आप देख सकते हैं कि नए क्रोनों को स्थापित नहीं किया गया हैcrontab -l
एक crontab फ़ाइल में पाँच फ़ील्ड निर्दिष्ट करने के लिए मिनट, घंटे, महीने का दिन, महीना और सप्ताह का दिन होता है, जिसके बाद उस अंतराल पर कमांड को चलाया जाना चाहिए।
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0-6) (Sunday=0)
| | | +------- month (1-12)
| | +--------- day of month (1-31)
| +----------- hour (0-23)
+------------- min (0-59)
* उपरोक्त मान फ़ील्ड का अर्थ उस स्तंभ के लिए ब्रेसिज़ के रूप में सभी कानूनी मूल्यों से है।
यहाँ, मैंने इसके बारे में एक विस्तृत पोस्ट लिखी थी: यूनिक्स में सेटअप क्रोन
यदि आप चाहते हैं कि यह महीने के विशिष्ट दिनों में चलें, जैसे कि 1, 4, 7 वां, आदि ... तो आप बस अपनी स्क्रिप्ट में एक शर्त रख सकते हैं जो महीने के वर्तमान दिन की जाँच करता है।
मैंने सोचा कि इसके लिए आपको आवश्यक सभी चीज़ों की बजाय * / 3 का मतलब है जो हर तीन दिनों में, 1/3 का उपयोग करता है जिसका अर्थ है कि हर तीन दिन महीने के 1 तारीख से शुरू हो रहा है। तो 7/3 का मतलब होता है हर तीन दिन जो महीने के 7 वें दिन से शुरू होता है, आदि।
0 0 * * * [ $(($((दिनांक +% - j- 1)) % 3)) == 0 ] && script
वर्ष का दिन प्राप्त करें date, 0 से शुरू करने के लिए 1 से ऑफसेट करें, जांचें कि क्या यह तीन है।
( 365-1 ) % 3 == 1लेकिन तब से ( 1 - 1 ) % 3 == 0? मुझे लगता है कि बेहतर गणना यूनिक्स युग के बाद के दिनों की संख्या पर आधारित होगी।