यूनिक्स: निर्दिष्ट समय तक सो जाओ


12

क्या कोई (अर्ध) मानक यूनिक्स कमांड है जो अपनी कमांड लाइन पर निर्दिष्ट समय तक सोएगा? दूसरे शब्दों में, मैं कुछ ऐसी ही चीज़ों की तलाश कर रहा हूँ sleepजो अवधि के बजाए वेकअप टाइम लेती हैं।

उदाहरण के लिए: sleeptill 05:00:00

मैं कुछ कोड कर सकता हूं, लेकिन पहिया का फिर से आविष्कार नहीं करेगा अगर वहां पहले से ही कुछ है।

बोनस प्रश्न: यह बहुत अच्छा होगा यदि यह समयक्षेत्र (जैसा कि sleeptill 05:00:00 America/New_York) ले सकता है ।

संपादित करें कि मैं जो कुछ भी कर रहा हूं उसकी प्रकृति के कारण, मैं "टी पर" रन कमांड के बजाय "नींद तक" की तलाश कर रहा हूं।

संपादित करें संदेह से बचने के लिए, अगर मैं 18:00 पर कमांड चलाता हूं और इसे 17:00 बजे जगाने के लिए कहता हूं, तो मैं उम्मीद करता हूं कि यह 23 घंटे (या, कुछ कोने के मामलों में) दिन के उजाले की बचत समय के साथ करेगा। 22 या 24 घंटे के लिए।)


आप उपयोग कर सकते हैं cron, मुझे लगता है।
बॉबी

धन्यवाद, लेकिन इच्छित उपयोग के लिए यह वास्तव में समान होना चाहिए sleep
एनपीई

जवाबों:


18

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

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))

(1700 जा रहा है 5PM और -j कह तारीख वास्तव में तारीख निर्धारित नहीं)


(+1) सुझाव के लिए। अगर मैं 18:00 पर कमांड चलाता हूं और इसे 17:00 बजे जगाने के लिए कहता हूं, तो मुझे उम्मीद है कि यह 23 घंटे (या, दिन के समय बचत समय के साथ 22 या 24 घंटे के लिए करने वाले कुछ मामलों में) सोएगा। यह वह जगह है जहाँ सुझाव दुर्भाग्य से टूट जाता है। [मैं भी बदलना पड़ा -jकरने के लिए -d। यह मेरे Linux सिस्टम पर चलने बनाने के लिए]
एनपीई

7
@ ऐक्स: लिनक्स (और जीएनयू तिथि के साथ अन्य सिस्टम) पर, आप परिष्कृत तारीख विनिर्देशों का उपयोग कर सकते हैं जैसे कि date -d 'tomorrow 17:00'
गिलेस एसओ- बुराई को रोकना '

3
@ एनपीई, btw, एक अनुस्मारक-विभाजन का उपयोग करके क्षतिपूर्ति कर echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))सकता है : (डीएसटी-परिवर्तन के आसपास केवल कुछ मुद्दे हो सकते हैं)
hvr

13

इस बारे में कैसे (w00t और एक समारोह में Gille के विचारों के संयोजन)?

function sleep_until {
  seconds=$(( $(date -d "$*" +%s) - $(date +%s) )) # Use $* to eliminate need for quotes
  echo "Sleeping for $seconds seconds"
  sleep $seconds
}

उपयोग:

sleep_until 8:24
Sleeping for 35 seconds

sleep_until '23:00'
Sleeping for 52489 seconds

sleep_until 'tomorrow 1:00'
Sleeping for 59682 seconds

9

लिनक्स / यूनिक्स atकमांड को देखें । 5AM उदाहरण का उपयोग करना:

at 05:00 some_command

यह टाइमज़ोन का भी समर्थन करता है:

GMT, UCT या ZULU (केस असंवेदनशील) का एक समय क्षेत्र का नाम यह निर्दिष्ट करने के लिए अनुसरण कर सकता है कि समय समन्वित सार्वभौमिक समय में है। अन्य टाइमज़ोन को TZ पर्यावरण चर का उपयोग करके निर्दिष्ट किया जा सकता है।


(+1) सुझाव के लिए। दुर्भाग्य से, यह मेरे वर्कफ़्लो में स्वाभाविक रूप से फिट नहीं है। मेरे पास एक स्क्रिप्ट है जो अनुक्रम में चीजों का एक गुच्छा चलाता है, और मैं यह सुनिश्चित करना चाहता हूं कि कुछ निश्चित समय तक कुछ कदमों को लात नहीं मारना है। यह निश्चित रूप से किसी ऐसी चीज में परिवर्तित किया जा सकता है जो उपयोग करता है cronया at, लेकिन यह प्रबंधन करने के लिए एक दर्द होगा। यही कारण है कि मैं कुछ इसी sleepतरह की तलाश कर रहा हूं । अभी के लिए, मैंने अपना लिखा है।
एनपीई

आह, तो आप एक अवरुद्ध अनुसूची चाहते हैं। प्रक्रिया के प्रत्येक चरण पर नज़र रखने के लिए एक राज्य फ़ाइल क्यों नहीं है?
जेरेमी एल

कर सकता है, लेकिन मुझे लगता है कि यह होने की आवश्यकता से कुछ अधिक जटिल लगता है। चरण अलग-अलग कमांड हैं, और शेल स्क्रिप्ट वह है जो वर्कफ़्लो को ऑर्केस्ट्रेट करता है। स्क्रिप्ट में "शाम 5 बजे तक सोने में सक्षम" होने के नाते मुझे वास्तव में ज़रूरत है।
एनपीई

उस स्थिति में w00t का उत्तर ठीक वही हो सकता है जो आप के बाद है।
जेरेमी एल

हां, यह सही भावना में है। अफसोस की बात है, यह कुछ महत्वपूर्ण (मेरे लिए) मामलों में टूट जाता है और टाइमज़ोन नहीं करता है।
NPE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.