विशिष्ट समय की अगली घटना तक सोएं


11

मुझे कमांड की एक श्रृंखला या एक एकल कमांड की आवश्यकता है जो एक विशिष्ट समय की अगली घटना तक सोता है जैसे "4:00" होता है।

मुझे यह कैसे करना है?

atआदेश या एक cronjob एक विकल्प है क्योंकि मैं स्क्रिप्ट मैं में वर्तमान में कर रहा हूँ छोड़ नहीं होना चाहिए नहीं है।

मैं जिस विशिष्ट मामले की बात कर रहा हूं, वह स्क्रीन में चल रही एक स्क्रिप्ट है। यह बहुत महत्वपूर्ण है कि मैं स्क्रिप्ट के निष्पादन को स्क्रिप्ट द्वारा स्वयं रोकना नहीं चाहता हूं क्योंकि कई महत्वपूर्ण चर संग्रहित हैं जो स्क्रिप्ट के कुछ बिंदु पर आवश्यक हैं। स्क्रिप्ट को हमेशा एक नियमित मामले में निष्पादित नहीं किया जाता है। इसे केवल एक विशिष्ट समय पर निष्पादित करने की आवश्यकता है।

अगर यह स्क्रिप्ट किसी भी फाइल या किसी अन्य कार्य जैसे क्रोनोजर या अन्य स्क्रीन को बनाना होगा तो यह बहुत ही हानिकारक होगा। यह केवल डिजाइन का सवाल है।

मेरे पास एक अच्छा विचार था:

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

क्या आपके पास कोई बेहतर विचार है?

अनुरोध किए जाने पर अधिक जानकारी जोड़ी जाएगी!


कृपया आप अपना प्रश्न थोड़ा स्पष्ट कर सकते हैं? जब आप कहते हैं कि आपका क्या मतलब है: "मुझे उस स्क्रिप्ट को नहीं छोड़ना चाहिए जो मैं वर्तमान में हूं"
sebelk

कैसे आप के बारे में एक "जागो" फ़ाइल के अस्तित्व के लिए अपनी स्क्रिप्ट की जाँच करें और फिर से जाँच करने से पहले कुछ समय के लिए सो जाओ? फिर आप फ़ाइल बनाने के लिए क्रॉन का उपयोग कर सकते हैं, क्रोन की विश्वसनीयता का लाभ उठा सकते हैं, लेकिन आपके पास आपकी लंबी-चौड़ी स्क्रिप्ट भी हो सकती है। बस स्क्रिप्ट को "वेक अप" फाइल को हटा दें जब वह सो रही हो।
कुर्टम

ध्यान दें कि किसी Mac आप बदलना चाहिए date -dसाथ date -jऔर की जगह 4:00के साथ 0400
pjvandehaar

जवाबों:


17

टेरडॉन का सुझाव काम करेगा लेकिन मुझे लगता है कि मेरा काम ज्यादा कुशल है।

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

यह दिए गए समय और वर्तमान समय के बीच सेकंड में अंतर की गणना कर रहा है। यदि संख्या ऋणात्मक है तो हमें पूरे दिन के लिए सेकंड जोड़ना है (86400 सटीक होना) सेकंड प्राप्त करने के लिए हमें सोना होगा और यदि संख्या पोस्टिव है तो हम इसका उपयोग कर सकते हैं।


क्या होता है अगर सिस्टम क्लॉक आगे / पीछे की ओर बढ़ता है (जैसे: ntp)।
WhyNotHugo

10

मान लें कि यह एक शेल स्क्रिप्ट है, तो यह काम करना चाहिए:

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done

वह 24 घंटे के लिए है। यदि आप चाहते हैं कि यह 4:00 पूर्वाह्न 4:00 बजे तक जारी रहे, तो इसके बजाय इसका उपयोग करें:

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done

यह एक विकल्प हो सकता है। मुझे सिर्फ अंदाजा था। मैं कुछ मिनटों में वापस आ जाऊंगा।
ब्रेनस्टोन

0

पर OpenBSD , निम्नलिखित एक कॉम्पैक्ट करने के लिए इस्तेमाल किया जा सकता */55 मिनट की crontab(5)एक में काम 00प्रति घंटा एक (जबकि सटीक अंतराल पर एक ही कार्य कर सभी को यकीन कम ईमेल उत्पन्न कर रहे हैं बनाने के लिए,):

#!/bin/sh -x
for k in $(jot 12 00 55)
  do
  echo $(date) doing stuff
  sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done

ध्यान दें कि अंतिम पुनरावृत्ति पर डिज़ाइन द्वारा date(1)भी टूट जाएगा sleep(1), क्योंकि 60मिनट एक वैध समय नहीं है (जब तक यह है!), इस प्रकार हमें अपनी ईमेल रिपोर्ट प्राप्त करने से पहले किसी भी अतिरिक्त समय की प्रतीक्षा नहीं करनी होगी।

यह भी ध्यान दें कि पुनरावृत्तियों में से किसी एक को इसे आवंटित करने में 5 मिनट से अधिक समय लगना चाहिए, sleepइसी तरह से सोने से बिल्कुल नहीं सोते हुए डिजाइन द्वारा विफल हो जाएगा (एक कमांड लाइन विकल्प के रूप में नकारात्मक संख्या की व्याख्या के कारण क्या है, बजाय चारों ओर लपेटने के। अगले घंटे या अनंत काल तक, इस प्रकार यह सुनिश्चित करना कि आपका काम अभी भी आवंटित घंटे के भीतर पूरा हो सकता है (उदाहरण के लिए, यदि केवल पुनरावृत्तियों में 5 मिनट से थोड़ा अधिक समय लगता है, तो हमारे पास अभी भी पकड़ने का समय होगा, बिना अगले घंटे के आसपास कुछ भी लपेटना)।

की printf(1)जरूरत है क्योंकि dateमिनट विनिर्देश के लिए वास्तव में दो अंकों की उम्मीद है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.