हर तीन दिन में क्रोन की नौकरी


93

क्या हर तीन दिन में क्रोनजॉब चलाना संभव है ? या शायद 10 गुना / महीना।


4
हां यह संभव है और यह सुपरयूजर पर आधारित है।

महीने की सीमाओं की परवाह किए बिना हर 3 दिन दौड़ना एनाक्रॉन के साथ किया जा सकता है।
राणापट्टिसन

जवाबों:


123

इसे हर तीन दिन में चलाएं ...

0 0 */3 * *

उस के बारे में कैसा है?

यदि आप चाहते हैं कि यह महीने के विशिष्ट दिनों में चलें, जैसे कि 1, 4, 7 वां, आदि ... तो आप बस अपनी स्क्रिप्ट में एक शर्त रख सकते हैं जो महीने के वर्तमान दिन की जाँच करता है।

if (((date('j') - 1) % 3))
   exit();

या, जैसा कि @mario बताते हैं, आप महीने के दिन के आधार पर वर्ष के दिन को प्राप्त करने के लिए दिनांक ('k') का उपयोग कर सकते हैं।


9
@whatshakin: यह इस बात पर निर्भर करेगा कि आप "हर तीन दिन" कितना सही चाहते हैं। यह किसी भी दिन काम करेगा जो 3 से विभाज्य है। महीने की सीमाओं पर यह सटीक नहीं होगा।
डेविड

3
@ श्वेतशकिन: क्रोनजोब सिंटैक्स का वर्णन विकिपीडिया पर भी किया गया है। en.wikipedia.org/wiki/Cronjob
फेलिक्स क्लिंग

4
यह Google पर एक बहुत ही उच्च परिणाम है, और इस तरह यह बेहतर होगा यदि स्वीकृत उत्तर सही था, जो कि यह नहीं है। मेरा मानना ​​है कि तारेको की व्याख्या सही है।
lynks

13
उत्तर सही नहीं है क्योंकि न तो सुझाव वास्तव में हर 3 दिन में काम चलाता है। 0 0 */3 * *साधन 1, 4, 7, आदि (पर चलने */3का मतलब है 1-31/3इसका मतलब है 1,4,7...31) तो खाई महीने के अंत में छोटा होगा। (यह पंक्ति में 2 दिन चलेगा अगर पिछले महीने में 31 दिन थे।) date('j') % 3इसमें एक समान समस्या है कि पैटर्न हर साल फिर से शुरू होता है, और वर्षों में 3. द्वारा विभाज्य दिनों की संख्या नहीं होती है
cjm

8
मैं भी इसे दुर्भाग्यपूर्ण मानता हूं कि इसे उत्तर के रूप में स्वीकार किया गया। मैं वास्तव में हर एन दिनों की तलाश कर रहा था, चाहे महीने की सीमाओं की परवाह किए बिना (जैसे पौधों को परवाह नहीं है कि वे महीने के किस दिन अपना पानी प्राप्त करते हैं)। कम से कम मुझे लगता है कि मैंने सभी टिप्पणियों को पढ़ने के बाद निर्धारित किया है, कि क्रोन टाइमर पूरी तरह से उस इच्छा को मॉडल नहीं करता है।
ट्रैविस ग्रिग्स

68
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.

स्पष्टीकरण की सराहना
pythonian29033

2
यह आमतौर पर हर तीन दिनों में आग
लगाएगा

24

मैं एक क्रॉन विशेषज्ञ नहीं हूं, लेकिन इसके बारे में कैसे:

0 */72 * * *

यह हर 72 घंटे में बिना रुके चलेगा।

https://crontab.guru/#0_ / 72_ _ _


3
यह स्वीकृत समाधान की तुलना में अधिक सटीक है। महीने बदलने पर स्वीकृत उत्तर विफल हो जाएगा:then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
अकीरा यामामोटो

यह कब घटित होगा इसकी गणना कैसे की जाती है?
ब्रूस एज

2
Crontab.guru के अनुसार यह हर दिन चलता है। कौन सही है?
उल्टा

घंटे कॉलम में मान crontab.guru और आदमी crontab के अनुसार 0 से 23 के बीच होना चाहिए ।
harperville

1
* * 72 प्रभावी रूप से 0 के रूप में ही है। यह हर आधी रात को चलता है।
battey

19

क्योंकि क्रोन "स्टेटलेस" है, यह "आवृत्तियों" को सही ढंग से व्यक्त नहीं कर सकता है, केवल "पैटर्न" जो यह (जाहिरा तौर पर) वर्तमान समय के खिलाफ लगातार मेल खाता है।

आपके प्रश्न को रीफ़्रेश करने से यह और अधिक स्पष्ट हो जाता है: "क्या हर रात 00:01 बजे एक क्रोनजॉब चलाना संभव है सिवाय रातों को छोड़कर जब वह 2 रातों के भीतर चला था?" जब क्रोन वर्तमान समय की तुलना नौकरी के अनुरोध के समय के पैटर्न से कर रहा है, तो कोई तरीका नहीं है कि क्रॉन को पता चल सके कि क्या यह आपके अतीत में काम करता है।

आमतौर पर आपको उस आवर्ती घटना को समाप्त करना होगा और पूरी तरह से नया शुरू करना होगा; यह इस बात की सीमित अभिव्यक्ति को दर्शाता है कि कैसे जटिल कैलेंडर एप्लिकेशन भी दोहराए जाने वाले पैटर्न का प्रतिनिधित्व करते हैं। और निश्चित रूप से कैलेंडर्स के पास बहुत अधिक राज्य हैं - प्रत्येक व्यक्तिगत घटना को स्वतंत्र रूप से हटाया जा सकता है या [ज्यादातर कैलेंडर ऐप्स में] पुनर्निर्धारित किया जा सकता है।)

इसके अलावा, आप शायद हर 3 रात में अपना काम करना चाहते हैं यदि सफल हो , लेकिन अगर आखिरी बार असफल हो गए, तो तुरंत फिर से प्रयास करने के लिए, शायद अगली रात (3 दिन और इंतजार न करें) या फिर जल्द ही, एक घंटे बाद की तरह (लेकिन फिर से प्रयास करना बंद करें) सुबह के आगमन पर)। स्पष्ट रूप से, क्रोन संभवतः यह नहीं जान सकता है कि आपकी नौकरी सफल हुई और पैटर्न वैकल्पिक रूप से अधिक "रिट्री" शेड्यूल को भी व्यक्त नहीं कर सकता है।

वैसे भी - आप वही कर सकते हैं जो आप खुद चाहते हैं। एक स्क्रिप्ट लिखें, क्रॉन को इसे रात को 00:01 बजे चलाने के लिए कहें। यह स्क्रिप्ट किसी चीज़ की टाइमस्टैम्प की जांच कर सकती है * जो "अंतिम रन" को रिकॉर्ड करती है, और अगर यह 3 दिन पहले ** था, तो कार्य निष्पादित करें और "अंतिम रन" टाइमस्टैम्प को रीसेट करें।

(* वह टाइमस्टैम्पड इंडिकेटर एक ज़बरदस्त अवस्था है जिसे आप हेरफेर और जांच कर सकते हैं, लेकिन कौन सा क्रोन नहीं कर सकता है)

** यदि आप मानव पठनीय घड़ी समय का उपयोग कर रहे हैं तो अंकगणित से सावधान रहें - वर्ष में दो बार, कुछ दिनों में उनके दिन में 23 या 25 घंटे होते हैं, और 02: 00-02: 59 एक दिन में दो बार होता है या नहीं सब। इससे बचने के लिए यूटीसी का इस्तेमाल करें।


7
0 0 1-30/3 * *

यह 1 से शुरू होने वाले हर तीन दिन चलेगा। यहां 20 निर्धारित रन हैं -

  • 2015-06-01 00:00:00
  • 2015-06-04 00:00:00
  • 2015-06-07 00:00:00
  • 2015-06-10 00:00:00
  • 2015-06-13 00:00:00
  • 2015-06-16 00:00:00
  • 2015-06-19 00:00:00
  • 2015-06-22 00:00:00
  • 2015-06-25 00:00:00
  • 2015-06-28 00:00:00
  • 2015-07-01 00:00:00
  • 2015-07-04 00:00:00
  • 2015-07-07 00:00:00
  • 2015-07-10 00:00:00
  • 2015-07-13 00:00:00
  • 2015-07-16 00:00:00
  • 2015-07-19 00:00:00
  • 2015-07-22 00:00:00
  • 2015-07-25 00:00:00
  • 2015-07-28 00:00:00

4
2015-07-31 00:00:00, 2015-08-01 00:00:00 ... OOPS रनों के बीच केवल 1 दिन
Dziamid

4

मुझे नहीं लगता है कि आपके पास क्या है:

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

3

कैसा रहेगा:

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स्क्रिप्ट साल के अंत के बाद ही गलत है।


2

आपको मूल बातें सीखनी चाहिए 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

यह आसान होगा यदि आप इसे केवल सोमवार और तेरहवें दिन चलाने के लिए कॉन्फ़िगर करते हैं, जो इसे 3 और 4 दिन का ब्रेक देगा।

अन्यथा इसे दैनिक चलाने के लिए कॉन्फ़िगर करें, लेकिन अपनी php क्रोन स्क्रिप्ट से जल्दी बाहर निकलें:

if (! (date("z") % 3)) {
     exit;
}

0

यदि आप चाहते हैं कि यह महीने के विशिष्ट दिनों में चलें, जैसे कि 1, 4, 7 वां, आदि ... तो आप बस अपनी स्क्रिप्ट में एक शर्त रख सकते हैं जो महीने के वर्तमान दिन की जाँच करता है।

मैंने सोचा कि इसके लिए आपको आवश्यक सभी चीज़ों की बजाय * / 3 का मतलब है जो हर तीन दिनों में, 1/3 का उपयोग करता है जिसका अर्थ है कि हर तीन दिन महीने के 1 तारीख से शुरू हो रहा है। तो 7/3 का मतलब होता है हर तीन दिन जो महीने के 7 वें दिन से शुरू होता है, आदि।


0

0 0 * * * [ $(($((दिनांक +% - j- 1)) % 3)) == 0 ] && script

वर्ष का दिन प्राप्त करें date, 0 से शुरू करने के लिए 1 से ऑफसेट करें, जांचें कि क्या यह तीन है।


यह हिचकी नहीं होगी जब यह एक गैर-लीप वर्ष से अगले वर्ष तक लुढ़कता है, ( 365-1 ) % 3 == 1लेकिन तब से ( 1 - 1 ) % 3 == 0? मुझे लगता है कि बेहतर गणना यूनिक्स युग के बाद के दिनों की संख्या पर आधारित होगी।
किमी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.