हर 5 सेकंड में स्क्रिप्ट कैसे चलाएं?


66

मेरे पास एक स्क्रिप्ट है जिसे हर पांच सेकंड में चलाने की जरूरत है। मुझे पता है कि cronमिनटों से कार्य कर सकते हैं, लेकिन क्या हर सेकंड कुछ चलाने का एक तरीका है?


3
आप कौनसी समस्याएं हल करने की कोशिश कर रहे हैं? क्या आप सुनिश्चित हैं कि क्रोन सही समाधान है?
औरोल

1
मुझे पता है कि क्रोन सही समाधान नहीं है। मैं कह रहा था कि यह सवाल में नहीं था। कृपया पढ़ें। मैं हर 5 सेकंड में एक स्क्रिप्ट चलाने की कोशिश कर रहा हूं।
myusuf3

2
क्षमा करें, लगता है कि मुझे सवाल थोड़ा गलत लगा। फिर भी, अगर आप सही समस्या को हल करने की कोशिश कर रहे हैं, तो सोच रहे हैं।
औरोल

यहां आने वाले लोगों के लिए हर 5 सेकंड में कुछ न कुछ देखना है। मैं दृढ़ता से अनुशंसा करता हूं कि इसके बजाय आप एक उदाहरण के रूप में सॉकेट.आईओ जैसे टूल के साथ रियलटाइम प्रोग्राम करना सीखते हैं।
ब्रैंडन बर्टेल्सन

क्या आपने बैश स्लीप कमांड की खोज की है? sleep 55 सेकंड के लिए विराम (शायद एक लूप के भीतर) ...?
19

जवाबों:


64

क्रोन केवल एक मिनट के लिए अनुमति देता है। आप जो कर सकते थे , वह एक अनन्त लूप के साथ एक शेल स्क्रिप्ट लिखी गई है जो आपके कार्य को चलाता है, और फिर 5 सेकंड के लिए सोता है। इस तरह से आपका कार्य हर 5 सेकंड में कम या ज्यादा चलाया जाएगा, जो इस बात पर निर्भर करता है कि कार्य कितना समय लेता है।

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

आप my-task.shऊपर दी गई सामग्री के साथ एक फ़ाइल बना सकते हैं और इसे चला सकते हैं sh my-task.sh। वैकल्पिक रूप से आप इसे supervisorएक सेवा के रूप में कॉन्फ़िगर कर सकते हैं ताकि यह सिस्टम बूट आदि के समय शुरू हो जाए।

यह वास्तव में ध्वनि करता है जैसे आप कुछ ऐसा कर रहे हैं जो आपको संभवतः नहीं करना चाहिए। यह गलत लगता है


PHP आधारित स्क्रेपर्स में इस्तेमाल होने के लिए हर 5 या उससे भी कम सेकंड में एक आ क्रोन की जरूरत पड़ सकती है।
रवीश कुमार

वास्तव में गलत लगता है। यदि आप इसे क्रॉन जॉब में शामिल करते हैं तो आपके पास हर मिनट ओवरलैपिंग जॉब होगी। एक घंटे के बाद हर 5 सेकंड में 60 काम शुरू हो जाएंगे। यदि आप क्रॉन जॉब में शामिल नहीं होते हैं, तो ठीक है, आप यह नहीं जान सकते कि इसे कैसे रोका जाए, या यहां तक ​​कि यह जानने के लिए कि यह मौजूद है।
सीएफ

35

आपके पास cronहर मिनट एक स्क्रिप्ट को किक करने का काम हो सकता है जो 12 पृष्ठभूमि वाली प्रक्रियाओं को शुरू करता है:

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

हालांकि, मेरा सवाल यह है कि EARTH पर क्या आप ऐसा कर सकते हैं जिसे हर 5 सेकंड में चलाने की आवश्यकता है?


1
खैर, यह मेरे काम आया जब मैंने एक स्क्रिप्ट बनाई जो बार-बार /mediaएक ड्राइव के लिए निर्देशिका की जांच करती है जिसे मैं स्वचालित बैकअप के लिए USB में प्लग करता हूं ...
VF1

32
What on EARTH- आंकड़े, कचरा संग्रह, फ़ाइल सिंक, ऑनलाइन स्थिति, आप इसे नाम देते हैं।
23 नवंबर को ruX

3
निकट-रीयटाइम डेटा के लिए बाहरी एपीआई को संदर्भित करना। हर 5 सेकंड में रनिंग रिक्वेस्ट हर पेजव्यू पर करने से बेहतर है।
सर्गेई कुद्रियात्सेव

1
क्या होगा अगर crontab dostuff.sh फ़ाइल को दो बार निष्पादित करता है? उदाहरण के लिए, 55 वें सेकंड में, स्क्रिप्ट निष्पादित होती है, लेकिन अभी तक समाप्त नहीं हुई है, लेकिन क्रोन स्क्रिप्ट को फिर से कॉल करता है, तो क्या होगा?
टॉमसेवर

2
ये गलत है! यह संभावित रूप से एक बार में स्क्रिप्ट को एक से अधिक बार चलाता है (यदि यह 5 सेकंड से अधिक समय तक होता है) जो किसी भी (यहां तक ​​कि अस्थायी) फ़ाइलों तक दौड़ की स्थिति पैदा कर सकता है। यदि एक ही समय में एक ही काम दो बार करने से समस्या पैदा हो सकती है, तो ऐसा न करें! (और वह आमतौर पर होगा!)
नोनी मूस

27

बस एक लूप का उपयोग करें:

while true ; do ./your-script & sleep 5; done

यह आपकी स्क्रिप्ट को पृष्ठभूमि की नौकरी के रूप में शुरू करेगा, 5 सेकंड के लिए सोएगा, फिर फिर से लूप करेगा। आप इसे रद्द करने के लिए Ctrl-C का उपयोग कर सकते हैं, या इसके बजाय किसी अन्य शर्त का उपयोग कर सकते हैं true, उदाहरण के ! test -f /tmp/stop-my-scriptलिए केवल लूप जबकि फ़ाइल /tmp/stop-my-scriptमौजूद नहीं है।


यदि मैं एम्परसेंड को शामिल करता हूं bash: syntax error near unexpected token ';', तो यह कहता है , इसलिए मैंने इसे निकाल लिया। मेरे पास 4.3.11 है। मेरा आदेश जल्दी से चलता है तो यह ठीक है अगर यह अग्रभूमि में चलता है।
टायलर कोलियर

1
@TylerCollier यदि आपको ./your-scriptपृष्ठभूमि में (5-सेकंड की नींद के दौरान) दौड़ने की आवश्यकता थी , तो आप रख सकते हैं &लेकिन छोड़ सकते हैं ;। जैसा &कि आदेशों को अलग करने के उद्देश्य से किया गया है, यह अनावश्यक (और जाहिर तौर पर अनुमति नहीं है) ;एक ही लाइन पर इसके बाद है। एक और तरीका है लूप को कई लाइनों में लिखना (एक लाइन ब्रेक के बाद &और, वैकल्पिक रूप से, लाइन ब्रेक के बाद doऔर पहले doneभी)। के बाद से ;के बाद &लिखने में कोई त्रुटि हो गया लगता है, मैं इसे हटा दिया है। ब्ल्यूड: कृपया बेझिझक ;वापस डाल दें यदि आप वास्तव में चाहते हैं; यदि हां, तो मेरा सुझाव है कि एक स्पष्टीकरण भी जोड़ा जाए।
एलियाह कगन

@ एलियाकगन एफडब्ल्यूआईडब्ल्यू, यह ज़श (कोई सिंटैक्स त्रुटि) पर काम करता है, लेकिन यह वास्तव में आवश्यक नहीं है। संपादन के लिए धन्यवाद!
blueyed

10

आप GNU पैकेज mcron , "विक्सी क्रॉन" विकल्प का उपयोग कर सकते हैं ।

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"आसानी से बेहतर समय-बिंदुओं को निर्दिष्ट करने की अनुमति दे सकते हैं, यानी सेकंड। सिद्धांत रूप में इसे माइक्रोसेकंड तक बढ़ाया जा सकता है, लेकिन इसे लागू नहीं किया गया है।"


यह वहीं है जिसे मैं ढूंढ रहा था। धन्यवाद!
एसडीसोलर

कृपया इसे मेरे प्रश्न के उत्तर के रूप में यहां पोस्ट करें: askubuntu.com/questions/922216/… ताकि मैं आपके उत्तर को स्वीकार कर सकूं
एसडीसोलर



mcronsendmailडिफ़ॉल्ट रूप से स्थापित और सक्रिय करने की आवश्यकता है। इसे निष्क्रिय कैसे करें?
इशान

2

क्रोन में न्यूनतम कॉन्फ़िगरेशन मिनट है, आप इसे 5 सेकंड के लिए सेट नहीं कर सकते। आप क्वार्ट्ज का उपयोग कर सकते हैं जो सेकंड की अनुमति देता है। http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html


ऐसा लगता है कि क्वार्ट्ज खुला स्रोत नहीं है। क्या ये सही है?
txwikinger

इसका एक ओपन सोर्स वर्जन है। इसमें एक पेज नहीं है, लेकिन सिर्फ डाउनलोड पेज पर जाएं। आपको फॉर्म भरने की जरूरत नहीं है बस मुझे डाउनलोड करने के लिए ले जाएं।
कोड़ी हैरो

कम से कम 2018 के रूप में खुला स्रोत हो रहा है github.com/quartz-scheduler/quartz
dogmatic69

2

राउटर और स्विच को मॉनिटर करने के लिए कैक्टि का उपयोग करें, लेकिन क्रोन केवल एक मिनट की न्यूनतम अनुमति देता है, इसलिए यदि एक पोर्ट / डिवाइस नीचे है, तो दो मिनट अतीत तक कोई चेतावनी नहीं है।


1
मैं सलाह देता हूं कि इस उत्तर को संपादित करें कि इसे कैसे किया जाए, इसके बारे में विशिष्ट विवरणों के साथ इसका विस्तार करें। (यह भी देखें कि मैं एक अच्छा उत्तर कैसे लिख सकता हूँ? सामान्य सलाह के लिए, उबंटू
डेविड फ़ॉस्टर

2

आप एक SystemD टाइमर यूनिट का उपयोग कर सकते हैं, जो एक सेवा को ट्रिगर करेगा - जिसे आप वह करना चाहते हैं जो आप चाहते हैं - हर 5 सेकंड में।

मान लें कि आपकी सेवा इकाई को कॉल किया गया है mystuff.serviceऔर उसे स्थापित किया गया है /etc/systemd/system( SystemD उपयोगकर्ता सेवाओं की जांच करें यदि आप किसी उपयोगकर्ता के crontab को बदलना चाहते हैं), तो आप बूट समय पर सेवा को चलाने के लिए एक टाइमर इकाई लिख सकते हैं और फिर हर 5 सेकंड में, इस तरह:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

फिर सिस्टमड कॉन्फ़िगरेशन को फिर से लोड करें, टाइमर यूनिट को सक्षम करें और इसे शुरू करें।


1
यह सबसे अच्छा समाधान है, केवल नकारात्मक पक्ष यह है कि क्रोन अवलोकन और कॉन्फ़िगर करने के लिए बहुत आसान है। SystemD एक दर्द है और यह निर्देशिका संरचना के साथ शुरू होता है। 5 सेकंड के अंतराल के लिए अभी भी सबसे अच्छा है
जॉन

क्या उपरोक्त स्निपेट मिस्टाफ .service के बजाय /etc/systemd/system/mystuff.timer में नहीं जाएंगे?
ब्रूक्स

@ बरोक: हाँ, मेरी बुरी - बुरी कॉपी और पेस्ट मेरी तरफ। फिक्स्ड।
गेस

धन्यवाद ... मुझे यह जानकर खुशी है कि मैं पागल हूँ जब मैं सिस्टमड सीख रहा हूँ :)
ब्रूक्स

1

मैंने इस तरह की चीज़ को बहुत सफलतापूर्वक किया है (और मशीन को रिबूट होने तक, एक बार में अंतिम परिणाम रैंस सप्ताह)। जैसा कि मैं अभी कर रहा था, जानकारी अपडेट करना और इसे कैश में डालना - हर 10 सेकंड में अपडेट करना।

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

'निष्पादित $ 0' स्क्रिप्ट को पुनरारंभ करता है, लेकिन चल रही स्क्रिप्ट को प्रतिस्थापित करता है। यह शुरुआत में एक क्रॉस्टैब '@reboot' लाइन के साथ शुरू किया जा सकता है।


8
whileपटकथा को फिर से शुरू करने के बजाय लूप का उपयोग क्यों नहीं किया जाता है?
डेविड जेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.