शेल: `स्लीप` का उपयोग किए बिना एक कमांड में देरी करना संभव है?


21

क्या बिना उपयोग के कमांड में देरी के लिए कोई विकल्प, विकल्प या बैश ट्रिक हैं sleep? उदाहरण के लिए, वास्तव में नींद का उपयोग किए बिना नीचे दिए गए आदेश का पालन करना:

$ sleep 10 && echo "This is a test"

42
इसमें गलत क्या है sleep?
मूरू

5
जिज्ञासा के अलावा कोई वास्तविक कारण नहीं है। मैंने सोचा कि कुछ वैकल्पिक समाधान सीखना दिलचस्प होगा। मुझे लगता है कि atएक हो सकता है, लेकिन मुझे कोई उपयोग उदाहरण नहीं मिला।
user321697

1
@ user321697 "at" सिंगल जॉब्स शेड्यूल करना है। वे atd सेवा द्वारा निष्पादित किए जाते हैं, इसलिए वे आपकी शेल स्क्रिप्ट को रोक नहीं पाएंगे। इसके लिए एक उपयोग मामला यह होगा कि यह एक निर्दिष्ट समय (async) पर कुछ करे और समाप्त होने पर एक मार्कर फ़ाइल बनाए, जबकि आपकी स्क्रिप्ट उस फ़ाइल के थोड़ी देर में प्रदर्शित होने की प्रतीक्षा कर रही हो। आप अपनी स्क्रिप्ट को SIGCONT भेजने के लिए नौकरी शेड्यूल करके और फिर खुद को SIGSTOP भेजकर अपनी स्क्रिप्ट को फ्रीज करके एक समान प्रभाव प्राप्त कर सकते हैं।
ग्रीगा ब्रेमेक

1
मैं हर किसी को एक सुझाव देने की उम्मीद में यहां आया था। मुझे सभी उत्तरों से सुखद आश्चर्य हुआ।
दान वैन होके

3
पुन: "जिज्ञासा" - unix.stackexchange.com/help/dont-ask में , इस बात पर ध्यान दें कि "आपको वास्तविक समस्याओं के आधार पर केवल व्यावहारिक, उत्तर देने योग्य प्रश्न ही पूछने चाहिए " - कि यह अच्छी तरह से किया गया है- दिशानिर्देश के विपरीत प्राप्त होने के बावजूद दिशानिर्देश इसे एक दुर्लभ अपवाद नहीं बनाता है।
चार्ल्स डफी

जवाबों:


17

आपके पास विकल्प हैं sleep: वे हैं atऔर cronsleepइन के विपरीत आपको उस समय को प्रदान करने की आवश्यकता है जिस पर आपको उन्हें चलाने की आवश्यकता है।

  • सुनिश्चित करें कि atdसेवा निष्पादित करके चल रही है service atd status
    अब मान लेते हैं कि तिथि ११:१ is पूर्वाह्न यूटीसी है; यदि आप 11:25 यूटीसी पर एक आदेश पर अमल करने की जरूरत है, वाक्य रचना है: echo "This is a test" | at 11:25
    अब ध्यान रखें कि atdडिफ़ॉल्ट रूप से नौकरियों के पूरा होने में प्रवेश नहीं करेगा। अधिक जानकारी के लिए इस लिंक को देखें । बेहतर है कि आपके एप्लिकेशन की अपनी लॉगिंग हो।

  • आप cronअधिक संदर्भ के लिए, man cronइसके विकल्प देखने के crontab -eलिए या नई नौकरियां जोड़ने के लिए नौकरियों को निर्धारित कर सकते हैं । /var/log/cronनौकरियों पर निष्पादन के बारे में जानकारी के लिए जाँच की जा सकती है।

FYI sleep system call करेंट सस्पेंशन को सस्पेंड करता है और शेड्यूल करता है कि यह उसको दिए गए तर्क को प्रभावित करता है।

संपादित करें:

जैसा कि @Gaius ने उल्लेख किया है, आप atकमांड के लिए मिनट का समय भी जोड़ सकते हैं । लेकिन कह सकते हैं कि समय है 12:30:30और अब आप शेड्यूलर के साथ भाग गए हैं now +1 minutes। भले ही 1 मिनट, जो 60 सेकंड में अनुवाद atकरता है , निर्दिष्ट किया गया था, वास्तव 12:31:30में नौकरी को निष्पादित करने तक इंतजार नहीं करता है , बल्कि यह नौकरी को निष्पादित करता है 12:31:00। समय-इकाइयाँ हो सकती हैं minutes, hours, days, or weeks। अधिक संदर्भ के लिएman at

उदाहरण के लिए: echo "ls" | at now +1 minutes


7
यह सच नहीं है, आप एक मिनट में चलने के लिए, अब +1 मिनट कहने के लिए नौकरी पर समय निर्धारित कर सकते हैं
Gaius

29

bashबिल्डिंस के साथ , आप कर सकते हैं:

coproc read -t 10 && wait "$!" || true

उपयोग किए बिना 10 सेकंड के लिए सोने के लिए sleepcoprocताकि बनाने के लिए है readके stdin एक पाइप जहां कुछ भी कभी से बाहर आ जाएगा। || trueऐसा इसलिए है क्योंकि waitबाहर निकलने की स्थिति एक SIGALRM डिलीवरी को दर्शाएगी जो errexitविकल्प सेट होने पर शेल से बाहर निकलने का कारण होगी ।

अन्य गोले में:

mkshऔर ksh93है sleepमें निर्मित है, और वहाँ कुछ भी का उपयोग कर (हालांकि वे दोनों भी समर्थन का कोई मतलब नहीं read -t)।

zshयह भी समर्थन करता है read -t, लेकिन इसके चारों ओर एक अंतर्निहित आवरण है select(), इसलिए आप इसका उपयोग भी कर सकते हैं:

zmodload zsh/zselect
zselect -t 1000 # centiseconds

यदि आप चाहते हैं कि इंटरेक्टिव शेल सत्र से चलने वाली चीजें शेड्यूल की जाएं, तो zsh/schedमॉड्यूल कोzsh भी देखें ।


क्या आप विचार करेंगे read -t 10 < /dev/zero || true?
जेफ स्कालर

5
@JeffSchaller मैं इससे बचूंगा क्योंकि यह एक व्यस्त लूप है।
स्टीफन चेजेलस

@ स्टीफनचेलजेल मैं उम्मीद नहीं करूंगा कि मैं एक व्यस्त लूप बन जाऊंगा - मुझे उम्मीद है कि किसी भी शेल readका चयन (2) या कुछ इसी तरह का उपयोग करके लागू किया जाएगा (मतलब यह है कि पढ़ने के साथ-साथ इस सवाल का एक अच्छा जवाब होगा)। मैं आपको विरोधाभास करने के बजाय आश्चर्य व्यक्त कर रहा हूं, लेकिन क्या आप इस पर आगे चर्चा कर सकते हैं?
नॉर्मन ग्रे

5
@ नोर्मनग्रे, /dev/zeroएक फाइल है जिसमें अनंत मात्रा में डेटा (एनयूएल बाइट्स) होता है। तो readउन 10 सेकंड के दौरान जितना हो सके उतना पढ़ेगा। शुक्र है, bashजिसके मामले में एनयूएल बाइट्स को अपने चर में रखने का समर्थन नहीं करता है, जो किसी भी मेमोरी का उपयोग नहीं करेगा, लेकिन यह अभी भी सीपीयू संसाधनों को हॉग करेगा।
स्टीफन चेजेलस

1
@NormanGray, यदि किसी टर्मिनल से चलाया जाता /dev/stdoutहै, तो वह tty डिवाइस होगा, इसलिए इसके साइड इफेक्ट्स होंगे (जैसे बैकग्राउंड में स्क्रिप्ट चलाना बंद हो जाता है) और उपयोगकर्ता द्वारा उदाहरण के लिए एंटर करने पर वापस आ जाएगा। read -t 10 /dev/stdout | :Linux पर काम करेगा, लेकिन केवल Linux पर, जबकि coprocOS की परवाह किए बिना काम करना चाहिए।
स्टीफन चेजेलस

7

कुछ अन्य विचार।

top -d10 -n2 >/dev/null

vmstat 10 2 >/dev/null

sar 10 1 >/dev/null

timeout 10s tail -f /dev/null

1
आपने टाइमलीमिट / टाइमआउट के मेरे विचार को "चुराया" .... +1
रुई एफ रिबेरो

1
ओह्ह मेरी, धन्यवाद, मैं नींद के बिना एक स्थिति में था, शीर्ष अद्भुत है!
फायर-ड्रैगन-डीओएल

6

चूंकि ऐसे उत्तर हैं जो गैर-मानक -t delayविकल्प का उपयोग करने का सुझाव दे रहे हैं read, यहां एक मानक शेल में रीड-आउट पढ़ने का एक तरीका है:

{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }

तर्क stty timeदूसरे के दसवें हिस्से में है।


5

बिल्ट-इन वैरिएबल $SECONDSऔर एक व्यस्त-लूप का उपयोग करना:

for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done

2
यह एक अवधि के लिए 9 से 10 सेकंड के बीच की अवधि में प्रभावी होगा, हालांकि ( एक बग केbash कारण , zshऔर mkshइसी तरह के मुद्दे थे, लेकिन तब से तय किए गए हैं)
स्टीफन चेज़लस

7
गर्मी बनाने का अच्छा तरीका।
बजे ctrl-alt-delor-

6
मैं पहली बार गर्म हवा से भरे होने का आरोप नहीं लगाऊंगा! :)
जेफ स्कालर

4

पुस्तक में सबसे पुरानी चाल:

read && echo "This is a test"

बस मारो Enterऔर यह जारी रहेगा!


यह अभ्यस्त यदि प्रक्रिया को इंटरैक्शन फ्री या बैकग्राउंड में चलाने की आवश्यकता है?
ss_iwe

सही: लेकिन यह ओपी की आवश्यकताओं में से एक नहीं था मूल प्रश्न के अनुसार, इसलिए अभी भी एक वैध उत्तर ... ;
Fabby

1
ओपी विशेष रूप से एक उदाहरण (के साथ sleep) देता है और बिना किसी समकक्ष विकल्प के पूछता है। तो readपंगु नहीं करता, क्षमा करें। ;)
AnoE

@AnoE स्टीफन का जवाब, सर्वोत्तम कोर्स का है मेरा सिर्फ सबसे पुराना है --- press «enter» to continue --- ;-)
Fabby

4

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

FOR I = 1 TO 10000:NEXT

शेल स्क्रिप्ट में देरी डालने के लिए समान सिद्धांत का उपयोग किया जा सकता है:

COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done

बेशक, इस दृष्टिकोण के साथ समस्या यह है कि देरी की लंबाई इसकी प्रोसेसर गति (या अलग-अलग लोड के तहत एक ही मशीन पर) के अनुसार मशीन से मशीन तक अलग-अलग होगी। इसके विपरीत sleep, यह संभवतः आपके सीपीयू (या इसके कोर में से एक) को अधिकतम कर देगा।


2
गर्मी बनाने का अच्छा तरीका।
बजे ctrl-alt-delor-

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

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

सीपीयू इतिहास के बारे में अधिक जानकारी के लिए, आधुनिक माइक्रोप्रोसेसर A 90-मिनट गाइड देखें! - लाइटर्रा.पैपर्स / ममोडर्नामिकप्रोसेसर
पीटर कॉर्डेस

3

कोई बिल्ट-इन नहीं है, जो वैसा ही करता है sleep(जब तक sleepकि बिल्ट-इन नहीं हो)। हालांकि कुछ अन्य कमांड हैं जो इंतजार करेंगे।

कुछ शामिल हैं।

  • atऔर cron: एक विशिष्ट समय में कार्यों को शेड्यूल करने के लिए उपयोग किया जाता है।

  • inotifywait: किसी फ़ाइल, या फ़ाइलों को संशोधित / हटाने / जोड़े जाने आदि के लिए प्रतीक्षा करने के लिए उपयोग किया जाता है


इसके लिए धन्यवाद। क्या आप एक निर्धारित कार्य (अब से 10 सेकंड) करने के लिए एक उदाहरण प्रदान कर सकते हैं at?
user321697

1
एक संपादन और एक उत्थान! ;-)
Fabby

cronकार्यों को crontabसही में स्टोर करें ? atअनुसूचित डेटा कहाँ संग्रहीत करता है ?
user321697

@ user321697 ने पहले ही यहां
Fabby

Q को अपने संपादन को वापस करने के लिए क्षमा करें: आपने ओपी प्रश्न के मुख्य उद्देश्य को बदल दिया है जो सभी के सबसे सरल उत्तर को अमान्य कर देगा ... all \ _ (ツ) _ / ¯
Fabby

3

विंडोज और बैच की भूमि से एक क्लासिक:

ping -c 11 localhost >/dev/null && echo "This is a test"

फ़ायरवॉल या नाम सिस्टम मिसकॉन्फ़िगरेशन एक महत्वपूर्ण अतिरिक्त विलंब कठिन का परिचय दे सकता है।
स्पेक्ट्रास

1
127.0.0.1 ... @spectras
AnoE

1
शुक्र है कि अब जरूरत नहीं है, क्योंकि विंडोज अब मूल रूप से नींद का समर्थन करता है।
बाल्ड्रिक

1
@AnoE> नेम सिस्टम पार्ट को सॉल्व करता है, फायरवॉल पार्ट को नहीं। हालांकि आम नहीं है, इसे स्थानीय इंटरफ़ेस पर पिंग को ड्रॉप करने के लिए कॉन्फ़िगर किया जा सकता है। इससे पिंग को अधिक समय तक इंतजार करना पड़ेगा।
स्पेक्ट्रास

"शौकीन" यादों के लिए +1
एसी

0

यदि आप किसी फ़ाइल में नई पंक्ति के लिए इंटरेक्टिवली प्रतीक्षा करना चाहते हैं, तो

tail -f

एक फाइलसिस्टम पर बदलाव की प्रतीक्षा की जा रही है? फिर उदाहरण के लिए उपयोग करें

inotify / inoticoming

और अन्य विकल्प भी हैं, जो "प्रतीक्षा" के साथ आपके अर्थ पर निर्भर करता है।

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