मैं प्रत्येक दिन 1 घंटे बाद क्रोनजोब कैसे शुरू कर सकता हूं?


16

मुझे हर दिन एक क्रोनजोब शुरू करने की आवश्यकता है, लेकिन प्रत्येक दिन एक घंटे बाद। वर्ष के 1 दिन को छोड़कर, मेरे पास अब तक सबसे अधिक भाग के लिए क्या काम है:

0 0 * * * sleep $((3600 * (10#$(date +\%j) \% 24))) && /usr/local/bin/myprog

जब वर्ष का दिन 365 है तो काम 5:00 बजे शुरू होगा, लेकिन अगले दिन (एक लीप वर्ष की गिनती नहीं) 1 वर्ष के रूप में एक दिन होगा, इसलिए नौकरी 1:00 पर शुरू होगी। मैं इस कोने के मामले से कैसे छुटकारा पा सकता हूं?


1
हर 25 घंटे में इसे शुरू नहीं करने का कोई कारण?
हालोसगॉस्ट

7
और आप वास्तव में ऐसा कैसे करेंगे? * (25 घंटे की स्थिति में) इसे हल नहीं करेगा।
बिर्च

@HalosGhost आपके सुझाव के लिए धन्यवाद! मैंने एक सरल कार्यान्वयन पर आधारित लिखा।
Giulio Muscarello

जवाबों:


23

मेरा पसंदीदा समाधान हर घंटे काम शुरू करना होगा लेकिन स्क्रिप्ट की जांच करें कि क्या यह चलाने का समय है या नहीं और 25 में से 24 बार कुछ किए बिना बाहर निकलें।

crontab:

0 * * * *    /usr/local/bin/myprog

सबसे ऊपर myprog:

[ 0 -eq $(( $(date +%s) / 3600 % 25 )) ] || exit 0

यदि आप स्वयं स्क्रिप्ट में कोई बदलाव नहीं करना चाहते हैं, तो आप "टाइम टू रन" चेक को कॉन्टैब एंट्री में भी डाल सकते हैं, लेकिन यह लंबी भद्दा रेखा के लिए बनाता है:

0 * * * *    [ 0 -eq $(( $(date +\%s) / 3600 \% 25 )) ] && /usr/local/bin/myprog

1
Crontab में बैकस्लैश के साथ '%' के बच जाने की आवश्यकता है।
बर्च

@ बर्छी मुझे कभी नहीं पता था कि! मुझे लगता है कि मैंने पहले कभी एक क्रॉस्टैब में एक% शामिल करने की कोशिश नहीं की। सुधार के लिए धन्यवाद, मैंने उत्तर संपादित किया है।
सेलडा

1
यह मुझे अच्छा लगता है। मुझे पता नहीं है कि ओपी डेलाइट सेविंग टाइम (आगे वसंत, पीछे गिरना) के संबंध में क्या करना चाहता है, लेकिन ओपी को तदनुसार समायोजन करना चाहिए।
एमोरी

मैं मंडल में चक्कर लगाने से थोड़ा चिंतित हूँ। यदि किसी कारण से समय जो कि dateकर्नेल से वापस मिल गया, उस समय से 1msपहले जब आप स्क्रिप्ट को चलाने की अपेक्षा करते हैं, तो चेक एक गलत परिणाम देगा।
कास्परड

1
@kasperd मुझे नहीं पता, मुझे लगता है कि आप अलग-अलग समय पर रिपोर्टिंग करने वाले विभिन्न सीपीयू के बारे में सही हो सकते हैं। के रूप में ntpd, यह केवल घड़ी को धकेलने के लिए कड़ी मेहनत करता है, इसे कूदना नहीं, विशेष रूप से इस तरह की समस्या से बचने के लिए, लेकिन आप सही हैं, यह (या ntpdate) कभी-कभी समय को पीछे की ओर कूद सकता है। cronअपनी नींद में देरी को गलत मानने के लिए, मुझे पूरा यकीन है कि इसे बग माना जाएगा! फिर भी, बिंदु लिया, और एक वैकल्पिक हल समस्या का कारण करने के लिए ... या reamainder लेने से पहले अंकगणित अभिव्यक्ति में ± 1800 जोड़ने के काम का समय निर्धारित करने का घंटा कम संभावना है कि पिछले 30 मिनट होगा आधुनिक 3600
Celada

7

यदि आपके सिस्टम में सिस्टमड है, तो आप इसके लिए टाइमर घटनाओं का उपयोग कर सकते हैं। बस एक नई सेवा को परिभाषित करें , जिसमें वह कमांड / कार्य होना चाहिए जिसे आप निष्पादित करना चाहते हैं, और फिर OnUnitActiveSecविकल्प के साथ एक टाइमर घटना बनाएं :

[Unit]
Description=daily + 1 hour task

[Timer]
OnUnitActiveSec=25h # run 25 hours after service was last started
AccuracySec=10min

[Install]
WantedBy=timers.target

फ़ाइलों के लिए एक ही नाम का उपयोग करें, सिवाय इसके कि .serviceआप उपयोग के बजाय .timer

synthesizing:

  1. निर्देशिका job.serviceमें नामक एक फ़ाइल बनाएँ /etc/systemd/system/
  2. इसे आवश्यक जानकारी के साथ भरें। आप कॉन्फ़िगरेशन का उपयोग करके सत्यापित कर सकते हैं systemctl status job.service
  3. एक फाइल बनाएं जिसका नाम job.timerमें /etc/systemd/system/
  4. इसे आवश्यक जानकारी के साथ भरें:

    [Unit]
    Description=daily + 1 hour task
    
    [Timer]
    OnUnitActiveSec=25h # run 25 hours after service was last started
    AccuracySec=10min
    
    [Install]
    WantedBy=timers.target
    
  5. टाइमर का उपयोग करके सत्यापित करें systemctl list-timers
  6. किया हुआ।

यदि मैं क्रोन की सादगी से भटका जा रहा था, तो मैं लॉन्चड का उपयोग करूंगा, जिसे सिस्टमड के लिए आपके उदाहरण से कम काम की आवश्यकता होगी।
बर्च

6

अगर आपको क्रोनॉजर्स के अलावा किसी और चीज़ का उपयोग करने में कोई आपत्ति नहीं है, तो मैं कम-ज्ञात उपयोगिता का सुझाव दूंगा at। बस एक रैपर स्क्रिप्ट लिखें जो दोनों शेड्यूल को 25 घंटे में चलाया जाए, और फिर अपने प्रोग्राम को कॉल करें। यह सबसे साफ समाधान लगता है।
उदाहरण के लिए, आप इसे ~ / script.sh में लिख सकते हैं:

echo "bash ~/script.sh" | at now + 25 hours
/usr/bin/yourprogram

और फिर बस bash ~/script.shएक बार चलाते हैं ।

25 घंटे में एक बार नौकरी शेड्यूल करने के विचार के लिए @HalosGhost को धन्यवाद।


2
atइस उद्देश्य के लिए उपयोग करने के साथ 2 समस्याएं हैं : (1) यदि नौकरी एक बार भी सही ढंग से निष्पादित नहीं हो पाती है, तो यह संभवत: स्वयं को पुनर्निर्धारित करने में भी विफल हो जाती है और फिर न केवल अगली निष्पादन बल्कि भविष्य के सभी निष्पादन प्रभावी रूप से एक मानव नोटिस तक रद्द कर दिए जाते हैं, और (2) चूंकि नौकरी को चलाने के लिए कुछ गैर-शून्य समय लगता है, इसलिए भोले now + 25 hoursका उपयोग करते हुए यह कुछ सेकंड (या अधिक) बाद में हर बार चलेगा, इस अंतराल में समय के साथ निर्माण होगा, जिससे यह पूरी तरह से गलत हो जाएगा समय।
सेलदा

2
आप # 1 के बारे में सही हैं; मैं # 2 के बारे में इतना निश्चित नहीं हूं। हालाँकि, मेरे पास कोई डेटा नहीं है, मुझे नहीं लगता कि घड़ी बदलने और काम के बीच देरी शुरू हो रही है और बाद में पुनर्निर्धारित किया जा सकता है, यह ध्यान देने योग्य होने के लिए पर्याप्त है - विशेष रूप से यह देखते हुए कि संकल्प atमिनटों तक सीमित है और सभी नौकरियां शुरू होती हैं [समय]: ००।
Giulio Muscarello

1
@Celada: अगले शेड्यूल करना atकाम पहली बात स्क्रिप्ट पर में उन समस्याओं से बचा जाता है। इसके बावजूद, यदि कोई त्रुटि होती है, तो पूरी श्रृंखला टूट जाती है, जो वांछित नहीं हो सकती है या नहीं: यदि उपयोग का मामला है "केवल इसे चलाएं जब यह काम करता है", पुनः आरंभ नहीं करना एक महान विशेषता है। लेकिन अगर उपयोग का मामला "हमेशा चलता है, भले ही अंतिम विफल हो" तो atसही उपकरण नहीं है।
बिशप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.