हर 30 सेकंड में एक क्रोन चलाना


313

ठीक है, इसलिए मेरे पास एक क्रोन है जिसे मुझे हर 30 सेकंड में चलाने की आवश्यकता है।

यही सब कुछ मेरे पास है:

*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'''

यह चलता है, लेकिन क्या यह हर 30 मिनट या 30 सेकंड में चल रहा है?

इसके अलावा, मैं पढ़ रहा हूं कि क्रोन का उपयोग करने के लिए सबसे अच्छा उपकरण नहीं हो सकता है अगर मैं इसे अक्सर चलाता हूं। क्या एक और बेहतर उपकरण है जो मैं Ubuntu 11.04 पर उपयोग या स्थापित कर सकता हूं जो एक बेहतर विकल्प होगा? क्या उपरोक्त क्रोन को ठीक करने का कोई तरीका है?


CommaToast, और क्या होता है यदि आपका जावास्क्रिप्ट या जावा ऐप किसी कारण से गिर जाता है और बाहर निकल जाता है? फिर से कैसे शुरू होगा? :-)
paxdiablo

12
थोड़ा NodeJS एप्लिकेशन जोड़ें, योग्य। थोड़ा सी ++ ऐप क्यों नहीं? जब हम इस पर होते हैं, हम इसे 'क्रोन' नाम दे सकते हैं और इसे सेवा के रूप में चला सकते हैं।
एंड्रयू


मैंने इसे केवल उपयोगकर्ता प्रोफाइल को देखने के दौरान पाया और देखा कि आप 1h से कम समय पहले ऑनलाइन थे (बस यह जांचने के लिए कि क्या आरोप अभी भी उपयोग में है), क्या कोई विशिष्ट कारण है कि आपने नीचे दिए गए किसी भी उत्तर को स्वीकार नहीं किया है?
फेबियान एन।

जवाबों:


731

आपके पास */30में मिनट कि साधन हर मिनट लेकिन 30 के एक कदम (दूसरे शब्दों में, हर आधे घंटे में) के साथ - विनिर्देशक। चूंकि cronउप-मिनट के प्रस्तावों में नीचे नहीं जाता है, इसलिए आपको दूसरा रास्ता खोजने की आवश्यकता होगी।

एक संभावना, हालांकि यह एक कीचड़ (ए) का एक सा है , दो काम करने के लिए है, एक 30 सेकंड से ऑफसेट:

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

आप देखेंगे कि मैंने टिप्पणियां जोड़ दी हैं और यह सुनिश्चित करने के लिए फ़ॉर्मेट किया है कि उन्हें सिंक्रनाइज़ रखना आसान है।

दोनों cronनौकरियों वास्तव में हर मिनट लेकिन चलाने के बाद , एक ही काम के "मांस" को क्रियान्वित करने से पहले आधे से एक मिनट इंतजार करेंगे /path/to/executable

अन्य (गैर- cronआधारित) विकल्पों के लिए, अन्य उत्तर यहां देखें, विशेष रूप से उल्लेख करने वाले fcronऔर systemd। ये संभवतः बेहतर हैं मान लें कि आपके सिस्टम में उन्हें इस्तेमाल करने की क्षमता है (जैसे कि इसमें fcronकोई डिस्ट्रो स्थापित करना या बनाना systemd)।


यदि आप कुल्डी समाधान का उपयोग नहीं करना चाहते हैं, तो आप एक छोटे संशोधन के साथ लूप-आधारित समाधान का उपयोग कर सकते हैं। आपको अभी भी अपनी प्रक्रिया को किसी न किसी रूप में चालू रखने का प्रबंधन करना होगा लेकिन, एक बार क्रमबद्ध होने के बाद, निम्न स्क्रिप्ट को काम करना चाहिए:

#!/bin/env bash

# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.

((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done

while true; do
    # Start a background timer BEFORE the payload runs.

    sleep 30 &

    # Execute the payload, some random duration up to the limit.
    # Extra blank line if excess payload.

    ((delay = RANDOM % maxtime + 1))
    ((maxtime += 1))
    echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
    [[ ${delay} -gt 30 ]] && echo
    sleep ${delay}

    # Wait for timer to finish before next cycle.

    wait
done

चाल को अपने पेलोड के चलने से पहले पृष्ठभूमिsleep 30 में इसे शुरू करने के लिए एक का उपयोग करना है । फिर, पेलोड समाप्त होने के बाद, बस पृष्ठभूमि समाप्त होने की प्रतीक्षा करें ।sleep

यदि पेलोड nसेकंड (जहां n <= 30) लेता है , तो पेलोड के बाद का इंतजार 30 - nसेकंड होगा। अगर ज्यादा लगे 30 सेकंड से समय , तो पेलोड समाप्त होने तक अगले चक्र में देरी होगी, लेकिन अब नहीं।

आप देखेंगे कि मेरे पास डिबग कोड है जिसमें आउटपुट शुरू करने के लिए एक मिनट की सीमा पर शुरू करना आसान है। मैं धीरे-धीरे अधिकतम पेलोड समय भी बढ़ाता हूं ताकि आप अंततः 30-सेकंड चक्र समय से अधिक पेलोड देख सकें (एक अतिरिक्त रिक्त लाइन आउटपुट है इसलिए प्रभाव स्पष्ट है)।

एक नमूना रन इस प्रकार है (जहां आमतौर पर चक्र पिछले चक्र के 30 सेकंड बाद शुरू होता है):

Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).

Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).

Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).

Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).

यदि आप कुल्डी के घोल से बचना चाहते हैं, तो यह बेहतर है। यदि आपको cronयह स्क्रिप्ट चल रही है और यदि नहीं, तो इसे शुरू करने के लिए आपको समय-समय पर पता लगाने के लिए नौकरी (या समकक्ष) की आवश्यकता होगी । लेकिन स्क्रिप्ट तभी टाइमिंग को संभालती है।


(ए) मेरे कुछ कार्यकर्त्ता कहेंगे कि कीचड़ मेरी विशेषता है :-)


29
यह एक महान समाधान है, इतना मुझे लगता है कि यह यह है कि यह ट्रांसजेंडर है
प्रश्न मार्क

14
@ rubo77, केवल अगर इसे चलाने में एक सेकंड से कम समय लगता है :-) यदि इसे 29 सेकंड लगते हैं, तो यह 0:00:00, 0: 00.59, 0:01:00, 0:01:59 और इतने पर होगा ।
पाक्सिडाब्लो

1
सुपर डरपोक, बहुत रचनात्मक!
के राफेल

2
दूसरी पंक्ति के चारों ओर के लिए गोल कोष्ठक क्या हैं?
निगेल एल्डर्टन

2
यह एक समस्या का एक प्यारा समाधान है जो अन्यथा कुछ कार्यों के लिए क्रिप्प्स प्रभावशीलता को प्रभावित करता है जिन्हें मिनटों के अंशों में निष्पादन की आवश्यकता होती है। धन्यवाद।
फिड्डी बक्स

67

आप नहीं कर सकते। क्रोन में 60 सेकंड की ग्रैन्युलैरिटी है।

* * * * * cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''
* * * * * sleep 30 && cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''

क्या यह वाक्य रचना paxdiablo के बराबर है? या सूक्ष्म अंतर हैं?
निकोलस राउल

अंतर यह है: मैंने बाइनरी के लिए मूल पथ का उपयोग किया था। @paxdiablo ने एक तरह का मेटा-सिंटैक्स इस्तेमाल किया। (और एक उप-शेल का आह्वान करता है)
Wildplasser

1
मेरा मतलब था, &&इसके बजाय का उपयोग करना ( ; )
निकोलस राउल

2
माफ़ करना। नहीं, एक अंतर है; &&ऑपरेटर शॉर्ट सर्किट, इसलिए श्रृंखला में अगले आदेश अगर पिछले एक में विफल रहा है निष्पादित नहीं है।
Wildplasser

यह ग्रैन्युलैरिटी एक सब-मिनट रिज़ॉल्यूशन के लिए एक मुद्दा नहीं होना चाहिए।
जुआन इज़ाज़ा

37

क्रोन की ग्रैन्युलैरिटी मिनटों में है और कुछ चलाने के लिए हर सेकंड को जगाने के लिए डिज़ाइन नहीं किया गया थाx । अपने दोहराए जाने वाले कार्य को एक लूप के भीतर चलाएं और इसे वही करना चाहिए जो आपको चाहिए:

#!/bin/env bash
while [ true ]; do
 sleep 30
 # do what you need to here
done

54
ध्यान रखें कि यह समान नहीं है । यदि नौकरी में 25 सेकंड लगते हैं (उदाहरण के लिए), तो यह हर 30 सेकंड के बजाय हर 55 सेकंड में शुरू होगा। इससे कोई फर्क नहीं पड़ता लेकिन आपको संभावित परिणामों के बारे में पता होना चाहिए।
पैक्सडीब्लो

7
आप पृष्ठभूमि में काम चला सकते हैं, तो यह लगभग 30 सेकंड में चलेगा।
क्रिस कोस्टोन

1
जबकि [सच] नींद 30 # करते हैं जो आपको यहां करने की आवश्यकता है --------- किया जाना चाहिए छोटे मामले में
मंदिर

1
while [ true ]आप एक ही स्क्रिप्ट के बहुत सारे उदाहरण होने का कारण नहीं बनेंगे, क्योंकि क्रोन हर एक मिनट में एक नई शुरुआत करेगा?
कारकेमानो

2
आप यह कर सकते हैं sleep $remainingTimeकि शेष समय 30 शून्य है जिस समय काम लिया (और इसे शून्य पर कैप करें यदि यह 30 सेकंड लिया गया)। इसलिए आप वास्तविक काम से पहले और बाद में समय निकालें और अंतर की गणना करें।
Mahemoff

32

यदि आप SystemD के साथ हाल ही में Linux OS चला रहे हैं, तो आप अपनी स्क्रिप्ट को चलाने के लिए SystemD Timer यूनिट का उपयोग अपनी इच्छानुसार किसी भी ग्रैन्युलैरिटी स्तर (सैद्धांतिक रूप से नैनोसेकंड्स के लिए नीचे) पर कर सकते हैं, और - यदि आप चाहें तो Cron द्वारा कभी भी अधिक लचीले लॉन्चिंग नियमों की अनुमति दी गई है । कोई sleepकीचड़ की आवश्यकता है

क्रोन फ़ाइल में सिंगल लाइन की तुलना में इसे सेट करने में थोड़ा अधिक लगता है, लेकिन अगर आपको "हर मिनट" से बेहतर कुछ चाहिए, तो यह प्रयास के लायक है।

SystemD टाइमर मॉडल मूल रूप से यह है: टाइमर इकाइयाँ समाप्त होने पर सेवा इकाइयाँ शुरू करने वाली इकाइयाँ होती हैं

इसलिए प्रत्येक स्क्रिप्ट / कमांड के लिए जिसे आप शेड्यूल करना चाहते हैं, आपके पास एक सर्विस यूनिट और फिर एक अतिरिक्त टाइमर यूनिट होनी चाहिए। एक सिंगल टाइमर यूनिट में कई शेड्यूल शामिल हो सकते हैं, इसलिए आपको आमतौर पर एक से अधिक टाइमर और एक सेवा की आवश्यकता नहीं होगी।

यहाँ एक सरल उदाहरण है जो हर 10 सेकंड में "हैलो वर्ल्ड" में प्रवेश करता है:

/etc/systemd/system/helloworld.service:

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer:

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.target

इन इकाइयों को स्थापित करने के बाद ( /etc/systemd/systemजैसा कि ऊपर वर्णित है, एक सिस्टम-वाइड सेटिंग के लिए, या ~/.config/systemd/userएक उपयोगकर्ता-विशिष्ट सेटअप के लिए), आपको चलाने से टाइमर को सक्षम करना होगा (न कि सेवा हालांकि) systemctl enable --now helloworld.timer( --nowझंडा भी टाइमर शुरू होता है तुरंत, अन्यथा, यह केवल अगले बूट, या उपयोगकर्ता लॉगिन के बाद शुरू होगा)।

[Timer]खंड यहां इस्तेमाल किया क्षेत्रों इस प्रकार हैं:

  • OnBootSec - प्रत्येक बूट के बाद यह सेवा कई सेकंड के लिए शुरू करें।
  • OnUnitActiveSec- आखिरी बार सेवा शुरू होने के कई सेकंड बाद इस सेवा को शुरू करें। यही कारण है कि टाइमर खुद को दोहराता है और क्रोन जॉब की तरह व्यवहार करता है।
  • AccuracySec- टाइमर की सटीकता निर्धारित करता है। टाइमर केवल इस क्षेत्र के सेट के रूप में सटीक हैं, और डिफ़ॉल्ट 1 मिनट है (क्रोन का अनुकरण करता है)। सर्वोत्तम सटीकता की मांग नहीं करने का मुख्य कारण बिजली की खपत में सुधार करना है - अगर सिस्टमड अन्य घटनाओं के साथ मेल खाने के लिए अगले रन को शेड्यूल कर सकता है, तो इसे सीपीयू को कम बार जगाना होगा। 1msऊपर के उदाहरण में आदर्श नहीं है - मैं करने के लिए आम तौर पर सेट सटीकता 1मेरी उप मिनट अनुसूचित नौकरियों में (1 सेकंड), लेकिन इसका मतलब यह होगा कि है कि यदि आप "नमस्ते दुनिया" संदेश दिखाना लॉग को देखो, आपको लगता है कि देखना चाहते हैं यह अक्सर 1 सेकंड से देर हो जाती है। यदि आप इसके साथ ठीक हैं, तो मैं सुझाव देता हूं कि 1 सेकंड या उससे अधिक की सटीकता निर्धारित करें।

जैसा कि आपने देखा होगा, यह टाइमर क्रोन की पूरी तरह से नकल नहीं करता है - इस अर्थ में कि कमांड हर दीवार घड़ी की शुरुआत में शुरू नहीं होती है (अर्थात यह घड़ी के 10 वें सेकंड से शुरू नहीं होती है, फिर 20 वें और इतने पर)। इसके बजाय टाइमर टाइमर ellapses है। यदि सिस्टम 12:05:37 पर बूट होता है, तो अगली बार कमांड रन 12:05:47 पर होगा, फिर 12:05:57 पर, आदि। यदि आप वास्तविक दीवार घड़ी सटीकता में रुचि रखते हैं, तो आप कर सकते हैं OnBootSecऔर OnUnitActiveSecफ़ील्ड्स को बदलना चाहते हैं और इसके बजाय OnCalendarआप चाहते हैं कि शेड्यूल के साथ एक नियम सेट करें (जो जहां तक ​​मुझे समझ में आता है वह कैलेंडर प्रारूप का उपयोग करके 1 सेकंड से अधिक तेज नहीं हो सकता है)। उपरोक्त उदाहरण के रूप में भी लिखा जा सकता है:

OnCalendar=*-*-* *:*:00,10,20,30,40,50

अंतिम नोट: जैसा कि आप शायद अनुमान लगाते हैं, helloworld.timerइकाई इकाई शुरू करती helloworld.serviceहै क्योंकि उनका एक ही नाम है (शून्य से इकाई प्रकार प्रत्यय)। यह डिफ़ॉल्ट है, लेकिन आप उस Unitफ़ील्ड को डिफ़ॉल्ट के लिए सेट करके ओवरराइड कर सकते हैं[Timer] अनुभाग के ।

अधिक विवरण प्राप्त किया जा सकता है:


2
मैं अक्सर टिप्पणी अनुभाग के तहत इस तरह के बेहतर उत्तर देता हूं। IMHO, हालांकि क्रोन अनुसूचित नौकरियों के लिए प्रधान रहा है, इस जवाब को स्वीकार किया जाना चाहिए क्योंकि इसकी "हैक जॉब" नहीं है और इसके लिए आवश्यक अंतराल / आवृत्ति को देखते हुए लंबे समय तक चलने वाले कार्यों को अंजाम देने के समानांतर
समीकरण को जोखिम में डालना है

2
शानदार उत्तर, चयनित उत्तर होना चाहिए
गाइडेडैकिंग

21

दो क्रोन प्रविष्टियों की आवश्यकता नहीं है, आप इसे एक में डाल सकते हैं:

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

आपके मामले में ऐसा है:

* * * * * /bin/bash -l -c "cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' ; sleep 30 ; cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''"


11
नोट: यह केवल सही चलता है अगर स्क्रिप्ट को चलाने के लिए सेकंड से कम समय लगता है
rubo77

2
रूबो - यदि नौकरी पूरी होने में सेकंड (मिलि या माइक्रोसेकंड के बजाय) को लंबा समय लग रहा है, तो आप इसे हर तीस सेकंड में नहीं चला पाएंगे, जो प्रति मिनट दो बार चलने में सक्षम होगा। तो हां, 30 से शुरू करें, फिर उस से घटाएं प्रति सेकंड की अनुमानित संख्या, यदि 1 सेकंड से अधिक हो।
एंड्रयू

2
यह भी मदद नहीं करता है यदि आप प्रत्येक रन के लिए त्रुटि रिपोर्ट अलग से प्राप्त करना चाहते हैं।
जॉएलन

joelin - मैं जो कमांड देता हूं वह लॉग या आउटपुट डेटा प्राप्त करने से नहीं रोकता है, मैंने प्रश्न को संबोधित करने के लिए कमांड को सरल किया। लॉगिंग कैप्चर करने के लिए, यदि आप लॉगिंग की आवश्यकता रखते हैं, तो प्रत्येक कमांड का उत्पादन / रीडायरेक्ट हो सकता है, उदाहरण के लिए स्क्रिप्ट / रेल रनर -e उत्पादन '\' 'Song.insert_latest' \ 'को स्क्रिप्ट / रेल रनर-प्रोडक्शन' \ 'के रूप में लिखा जा सकता है। 'Song.insert_latest' \ '2' & 1> / path_to_logfile और फिर से एकल क्रोन प्रविष्टि के भीतर प्रत्येक कमांड के लिए किया जा सकता है।
एंड्रयू

13

आप इसी तरह के सवाल के लिए मेरे जवाब की जांच कर सकते हैं

असल में, मैंने "रनएवरी.श" नामक एक बैश स्क्रिप्ट शामिल की है जिसे आप क्रोन के साथ हर 1 मिनट में चला सकते हैं और तर्क के रूप में पास कर सकते हैं असली कमांड जिसे आप चलाना चाहते हैं और सेकंड में आवृत्ति जिसे आप इसे चलाना चाहते हैं।

कुछ इस तरह

* * * * * ~/bin/runEvery.sh 5 myScript.sh


10

घड़ी का उपयोग करें:

$ watch --interval .30 script_to_run_every_30_sec.sh

क्या मैं कुछ उपयोग कर सकता हूँ $ watch --interval .10 php some_file.php? या watchकेवल .sh फ़ाइलों के साथ काम करता है?
येवहनी शशकोव

आप घड़ी से कुछ भी चला सकते हैं। हालांकि अंतराल अगले कमांड के अंत और शुरुआत के बीच है, इसलिए --interval .30एक मिनट में दो बार नहीं चलेगा। यानी watch -n 2 "sleep 1 && date +%s"यह हर 3 से बढ़ेगा।
jmartori

कृपया ध्यान दें कि watchटर्मिनल के उपयोग के लिए डिज़ाइन किया गया था, इसलिए - जबकि यह टर्मिनल के बिना काम कर सकता है ( nohupतब लॉगआउट के साथ) या नकली टर्मिनल के साथ (जैसे screen) - इसमें क्रोन जैसे व्यवहार के लिए कोई खर्च नहीं है, जैसे विफलता से उबरना, बूट आदि के बाद पुनः आरंभ करना '।
Guss

9

Cron job का उपयोग सेकंड अंतराल में किसी कार्य को निर्धारित करने के लिए नहीं किया जा सकता है। यानी आप हर 5 सेकंड में एक क्रोन जॉब शेड्यूल नहीं कर सकते। विकल्प एक शेल स्क्रिप्ट लिखना है जो उपयोग करता हैsleep 5 जो इसमें कमांड है।

नीचे दिखाए गए अनुसार लूप करते समय बैश का उपयोग करके प्रत्येक-5-seconds.sh शेल स्क्रिप्ट बनाएं।

$ cat every-5-seconds.sh
#!/bin/bash
while true
do
 /home/ramesh/backup.sh
 sleep 5
done

अब, nohupनीचे दिखाए गए अनुसार इस शेल स्क्रिप्ट को बैकग्राउंड में निष्पादित करें । यह आपके सत्र से लॉगआउट करने के बाद भी स्क्रिप्ट को निष्पादित करता रहेगा। यह हर 5 सेकंड में आपके backup.sh शेल स्क्रिप्ट को निष्पादित करेगा।

$ nohup ./every-5-seconds.sh &

4
समय बीतता जाएगा। उदाहरण के लिए, यदि backup.shचलाने में 1.5 सेकंड लगते हैं , तो यह प्रत्येक 6.5 सेकंड में निष्पादित होगा। इससे बचने के तरीके हैं, उदाहरण के लिएsleep $((5 - $(date +%s) % 5))
कीथ थॉम्पसन

मैं nohup में नया हूँ, आपके उदाहरण को निष्पादित करते हुए, nohup 'ऐसी कोई फ़ाइल या निर्देशिका' नहीं लौटा रहा है। कुछ खोजों के बाद, आपको नोक के बाद 'श' याद आती है। इस तरह: $ nohup sh ./every-5-seconds.sh &
VHanded

6

Fcron ( http://fcron.free.fr/ ) का उपयोग करें - आपको सेकंड में बारीकता देता है और क्रोन (विक्सी-क्रोन) और स्थिर की तुलना में बेहतर और अधिक सुविधा प्रदान करता है। मैं बहुत बेवकूफाना सेटिंग में एक मशीन पर चलने वाली लगभग 60 php लिपियों की तरह बेवकूफ चीजें बनाता था और यह अभी भी अपना काम करता था!


1
एक PHP डेवलपर के इकबालिया बयान; )
एरिक किगाथी

3
दरअसल, PHP डेवलपर्स को सक्षम करने वाले एक सिस्टम इंजीनियर के इकबालिया बयान .... :)
आदि चिरु

6

in dir /etc/cron.d/

नई एक फ़ाइल बनाएँ excute_per_30s

* * * * * yourusername  /bin/date >> /home/yourusername/temp/date.txt
* * * * * yourusername sleep 30; /bin/date >> /home/yourusername/temp/date.txt

हर 30 सेकंड में क्रोन चलाएंगे


4

वर्तमान में मैं नीचे दी गई विधि का उपयोग कर रहा हूं। बिना मुद्दों के साथ काम करता है।

* * * * * /bin/bash -c ' for i in {1..X}; do YOUR_COMMANDS ; sleep Y ; done '

आप हर चलाना चाहते हैं तो एन सेकंड तो एक्स हो जाएगा 60 / एन और Y हो जाएगा एन

धन्यवाद।


आप शायद बदलना चाहते हैं YOUR_COMMANDSके लिए YOUR_COMMANDS &है, ताकि आदेश पृष्ठभूमि करने के लिए शुरू की है, अन्यथा, आदेश एक दूसरे के एक अंश से ज्यादा लेता है - यह अगले प्रक्षेपण में देरी होगी। तो X = 2 और Y = 30 के साथ, यदि कमांड में 10 सेकंड लगते हैं - यह 30 मिनट के बजाय मिनट और फिर 40 सेकंड बाद लॉन्च होगा। कुद्दुस से @paxdiablo।
Guss

किसी कारण के लिए, यदि मैं छोड़ देते हैं /bin/bash -c(तर्क उद्धरण सहित) हिस्सा स्क्रिप्ट केवल हर मिनट चलाता है, यात्रा (मेरे मामले में अनदेखी X=12और Y=5)।
अबी

3

Crontab नौकरी का उपयोग मिनटों / घंटों / दिनों में नौकरी शेड्यूल करने के लिए किया जा सकता है, लेकिन सेकंड में नहीं। वैकल्पिक :

प्रत्येक 30 सेकंड में निष्पादित करने के लिए एक स्क्रिप्ट बनाएं:

#!/bin/bash
# 30sec.sh

for COUNT in `seq 29` ; do
  cp /application/tmp/* /home/test
  sleep 30
done

crontab -eइस स्क्रिप्ट को निष्पादित करने के लिए एक क्रेस्टैब का उपयोग करें :

* * * * * /home/test/30sec.sh > /dev/null

2
अगर मैं इसे सही ढंग से समझता हूं, तो यह स्क्रिप्ट 30 बार चलती है और हर पुनरावृत्ति के बीच 30 सेकंड इंतजार करती है। क्रोन में इसे हर मिनट चलाने के लिए कैसे समझ में आता है?
फज़ियामी

2

आप उस स्क्रिप्ट को सेवा के रूप में चला सकते हैं, हर 30 सेकंड में पुनः आरंभ कर सकते हैं

एक सेवा पंजीकृत करें

sudo vim /etc/systemd/system/YOUR_SERVICE_NAME.service

नीचे कमांड में पेस्ट करें

Description=GIVE_YOUR_SERVICE_A_DESCRIPTION

Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=YOUR_COMMAND_HERE
Restart=always
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

पुनः लोड सेवाएं

sudo systemctl daemon-reload

सेवा सक्षम करें

sudo systemctl enable YOUR_SERVICE_NAME

सेवा शुरू करें

sudo systemctl start YOUR_SERVICE_NAME

अपनी सेवा की स्थिति की जाँच करें

systemctl status YOUR_SERVICE_NAME

1

सभी अच्छे उत्तरों के लिए धन्यवाद। इसे सरल बनाने के लिए मुझे स्क्रिप्ट पर कॉन्टैब और टाइम डिवीजन पर नियंत्रण के साथ मिश्रित समाधान पसंद आया। इसलिए मैंने हर 20 सेकंड (प्रति मिनट तीन बार) पर एक स्क्रिप्ट चलाने के लिए यही किया। Crontab लाइन:

 * * * * 1-6 ./a/b/checkAgendaScript >> /home/a/b/cronlogs/checkAgenda.log

स्क्रिप्ट:

cd /home/a/b/checkAgenda

java -jar checkAgenda.jar
sleep 20
java -jar checkAgenda.jar 
sleep 20
java -jar checkAgenda.jar 

1-6 क्या दर्शाता है?
प्रेत ०7

@ Phantom007 1-6 सोमवार से शनिवार का प्रतिनिधित्व करता है, जहां "-" एक सीमा है और "0" रविवार है। यहाँ एक अच्छी कड़ी है जो सभी क्षेत्रों को बहुत अच्छी तरह से समझाती है और जहाँ आप इसका परीक्षण कर सकते हैं: " crontab.guru/# * _ * _ * _ * _ _ 1-6"
jfajunior

1

एक शेल स्क्रिप्ट बनाएँ .sh फ़ाइल लिखें

नैनो हर30 सेकेंड

और स्क्रिप्ट लिखें

#!/bin/bash
For  (( i=1; i <= 2; i++ ))
do
    write Command here
    sleep 30
done

तो इस स्क्रिप्ट crontab -e के लिए क्रोन सेट करें

(* * * * * /home/username/every30second.sh)

यह क्रोन कॉल .sh फ़ाइल हर 1 मिनट में और .sh फ़ाइल कमांड 2 बार 1 मिनट में चलाया जाता है

यदि आप 5 सेकंड के लिए स्क्रिप्ट चलाना चाहते हैं तो 30 को 5 से बदलें और लूप को इस तरह बदलें: For (( i=1; i <= 12; i++ ))

जब आप किसी दूसरे के लिए चयन करते हैं तो 60 / अपने दूसरे की गणना करें और फॉर लूप में लिखें


0

मेरे पास निम्न कार्य करने और उपयोग करने का समान कार्य था:

nohup watch -n30 "kill -3 NODE_PID" &

मुझे कई घंटों के लिए हर 30 सेकंड में एक आवधिक मार -3 (एक कार्यक्रम के स्टैक ट्रेस पाने के लिए) की आवश्यकता थी।

nohup ... & 

यह सुनिश्चित करने के लिए यहां है कि अगर मैं खोल (नेटवर्क समस्या, विंडोज़ क्रैश आदि ...) को ढीला कर देता हूं तो मैं घड़ी का निष्पादन नहीं खोता हूं।


0

बार-बार क्रोन पर एक नज़र डालें - यह पुराना है लेकिन बहुत स्थिर है और आप माइक्रो-सेकंड के लिए नीचे कदम रख सकते हैं। इस समय, केवल एक चीज जो मैं इसके खिलाफ कहूंगा वह यह है कि मैं अभी भी वर्कआउट करने की कोशिश कर रहा हूं कि इसे init.d के बाहर कैसे स्थापित किया जाए, लेकिन मूल सिस्टेम सेवा के रूप में, लेकिन निश्चित रूप से उबंटू 18 तक यह बस चल रहा है init.d का उपयोग करके अभी भी ठीक है (दूरी बाद के संस्करणों पर भिन्न हो सकती है)। यह सुनिश्चित करने का अतिरिक्त लाभ (?) है कि यह PHP स्क्रिप्ट का एक और उदाहरण नहीं देगा जब तक कि एक पूर्व पूरा नहीं हुआ है, जो संभावित मेमोरी लीकेज मुद्दों को कम करता है।


-1

शेल लूप में चलाएं, उदाहरण:

#!/bin/sh    
counter=1
while true ; do
 echo $counter
 counter=$((counter+1))
 if [[ "$counter" -eq 60 ]]; then
  counter=0
 fi
 wget -q http://localhost/tool/heartbeat/ -O - > /dev/null 2>&1 &
 sleep 1
done

यहां तक कि यह सोचते हैं कि 60एक होना चाहिए 30, जिसे आप ले जाना चाहते हो सकता है कि wget अंदरif बयान, अन्यथा यह हर दूसरे मार डाला है। किसी भी मामले में, मुझे यकीन नहीं है कि यह कैसे सिर्फ एक एकल से बेहतर है sleep 30। यदि आप अपने काउंटर के बजाय वास्तविक यूनिक्स समय की निगरानी कर रहे थे, तो इससे फर्क पड़ेगा।
पैक्सिडाब्लो

काउंटर प्रिंट आउट प्रतिध्वनित करें, यदि आप पृष्ठभूमि में विग नहीं चलाते हैं, तो आप EXCUTE COMMAND द्वारा विलंबित समय का पता लगा सकते हैं।
लो वेगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.