मैं बैश या क्ष में एक मिलीसेकंड के लिए कैसे सोता हूं


128

नींद एक बहुत लोकप्रिय आदेश है और हम 1 सेकंड से नींद शुरू कर सकते हैं:

# wait one second please 
sleep 1

लेकिन क्या विकल्प है अगर मुझे केवल 0.1 सेकंड या 0.1 से 1 सेकंड के बीच प्रतीक्षा करने की आवश्यकता है?

  • टिप्पणी: लिनक्स या ओएस एक्स sleep 0.XXXपर ठीक काम करता है, लेकिन सोलारिस sleep 0.1या sleep 0.01- अवैध सिंटैक्स पर

2
क्या मैं पूछ सकता हूं कि आप 1ms क्यों सोना चाहते हैं?
टॉम ओ'कॉनर

1
हां, मेरी बैश स्क्रिप्ट में मैं "स्लीप 1" जोड़ता हूं, कुछ पंक्तियों में, लेकिन स्क्रिप्ट बहुत धीमी गति से चलती है, इसलिए कुछ निष्कर्षों के बाद, मैं गणना करता हूं कि नींद 0.1 भी अच्छे परिणाम लाती है और अधिक तेजी से देरी के बारे में, मुझे आदेश में देरी की आवश्यकता है मेरी बैश स्क्रिप्ट में ssh समस्या को हल करने के लिए, मैं कुछ मशीनों के लिए पैरेलल ssh लॉगिन करता हूं, उम्मीद के बिना और बिना देरी के यह काम नहीं करेगा, जैसा कि आप जानते हैं कि मेरे सवाल से विलंब लिनक्स और सोलारिस दोनों को फिट होना चाहिए
येल

3
आप जो भी समाधान चुनते हैं, ध्यान रखें कि शेल स्क्रिप्ट समय के मामले में बहुत सटीक नहीं होगी।
स्काइ

कुछ ऐसा करने के बारे में जो निष्पादित करने में बहुत कम समय लेता है, लेकिन कुछ भी नहीं करता है .. जैसेecho "" >/dev/null
टॉम ओ'कॉनर

अच्छा विचार है लेकिन मिसेक इस आदेश को कैसे लेते हैं? , मुझे 0.1 मिसे की जरूरत है, फिर कम नहीं है कि - :)
येल

जवाबों:


68

बैश में एक "लोड करने योग्य" नींद है जो आंशिक सेकंड का समर्थन करती है, और एक बाहरी आदेश के ओवरहेड्स को समाप्त करती है:

$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep

फिर:

$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real    0m1.000s
user    0m0.004s
sys     0m0.004s

नकारात्मक पक्ष यह है कि लोडेबल्स आपके bashबाइनरी के साथ प्रदान नहीं किए जा सकते हैं , इसलिए आपको उन्हें खुद को संकलित करने की आवश्यकता होगी जैसा कि दिखाया गया है (हालांकि सोलारिस पर यह जरूरी नहीं है कि ऊपर जैसा सरल होगा)।

के रूप मेंbash-4.4 (सितंबर 2016) सभी loadables अब निर्माण कर रहे हैं और प्लेटफार्मों कि यह समर्थन करते हैं, हालांकि वे अलग साझा-वस्तु फ़ाइलों के रूप में बनाया जाता है पर डिफ़ॉल्ट रूप से स्थापित है, और एक के बिना .soप्रत्यय। जब तक आपके डिस्ट्रो / ओएस ने कुछ रचनात्मक नहीं किया है, आपको इसके बजाय सक्षम होना चाहिए:

[ -z "$BASH_LOADABLES_PATH" ] &&
  BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)  
enable -f sleep sleep

(मैन पेज का तात्पर्य BASH_LOADABLES_PATHस्वचालित रूप से सेट है, मुझे लगता है कि यह आधिकारिक वितरण में 4.4.12 के मामले में नहीं है। यदि और जब इसे सही ढंग से सेट किया गया है, तो आपको केवल enable -f filename commandnameआवश्यकतानुसार आवश्यक है।)

यदि यह उपयुक्त नहीं है, तो करने के लिए अगली सबसे आसान चीज sleepजीएनयू कोरुटिल्स का निर्माण या प्राप्त करना है , यह आवश्यक सुविधा का समर्थन करता है। POSIX sleepकमांड न्यूनतम है, पुराने सोलारिस संस्करणों को केवल उसी पर लागू किया गया है। सोलारिस 11sleep आंशिक सेकंड का समर्थन करता है

एक अंतिम उपाय के रूप में आप उपयोग कर सकते हैं perl(या किसी भी अन्य स्क्रिप्टिंग जिसे आपको हाथ करना होगा) कैविटी के साथ है कि दुभाषिया को शुरू करने का इरादा सोने के समय से तुलनीय हो सकता है:

$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh

2
आह, चूंकि आप उपयोग कर रहे हैं, आप expectशायद " after N" का उपयोग कर सकते हैं , जहां एन मिलीसेकंड है, सीधे आपकी स्क्रिप्ट में।
मर्सपुराटिक

usleep@Luis Vazquez और @sebix की तरह उपयोग करें
Ilan.K

Apple MacOS में BSD नींद है, जो भिन्नात्मक सेकंडों का भी समर्थन करती है
roblogic

125

Coreutilssleep से कमांड के लिए प्रलेखन कहता है:

नींद के ऐतिहासिक कार्यान्वयन के लिए आवश्यक है कि संख्या पूर्णांक हो, और केवल एक प्रत्यय के बिना एक ही तर्क को स्वीकार किया जाए। हालांकि, GNU स्लीप मनमाने ढंग से फ्लोटिंग पॉइंट नंबरों को स्वीकार करता है। फ्लोटिंग पॉइंट देखें ।

इसलिए आप उपयोग कर सकते हैं sleep 0.1, sleep 1.0e-1और इसी तरह के तर्क।


1
SOLARIS OS
yael

क्या तुमने मिलाया है और नहीं है ?
स्कै

मेरे गढ़ में मेरा अद्यतन देखें
येल १५'१३

1
हां, मुझे लगता है कि आपके प्रश्न में अभी भी बहुत सारे नकारात्मक हैं; क्या आप सुनिश्चित हैं कि आपका मतलब "अवैध सिंटैक्स नहीं है"?
मादहट

उदाहरण के लिए - मैं सोलारिस 10 पर चलता हूं: # नींद 0.1 नींद: तर्क में बुरा चरित्र, लिनक्स नींद के बारे में 0.1 काम ठीक
येल

58

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

एक सेकंड का 1/2

 sleep 0.5

एक सेकंड का 1/100

sleep 0.01

तो एक मिलीसेकंड के लिए आप चाहते हैं

sleep 0.001

4
आप दशमलव बिंदु से पहले अग्रणी शून्य को भी छोड़ सकते हैं। जैसे। sleep .5
माइक कॉसर


इसके अलावा सभी के बारे में बात करें ...
मार्टिन

1
@MikeCauser बाद में कोड के पाठक के लिए बहुत अधिक पठनीय और संकेत इरादे वाले शून्य का नेतृत्व करता है। भी बेहतर है जब आप वास्तव में गणित करते हैं।
अलेक्जेंडर मिल्स


8

आप बस उपयोग कर सकते हैं usleep। यह पैरामीटर के रूप में माइक्रोसेकंड (= 1e-6 सेकंड) लेता है, इसलिए 1 मिलीसेकंड सोने के लिए आप प्रवेश करेंगे:

usleep 1000

1
$ usleep No command 'usleep' found, did you mean: Command 'sleep' from package 'coreutils' (main) usleep: command not found
बुलेटमैग्नेट

नहीं, मेरा मतलब पैकेज usleepका वह हिस्सा है initscriptsजो सभी रेड हैट के वितरण में कम से कम मानक है; कम से कम RHEL, CentOS, Fedora, Mageia / Mandriva और SuSE सहित। यहाँ एक उदाहरण: `` ``
लुइस वाज़केज़

1
यहाँ CentOS 7 में एक नमूना इलस्ट्रेशन चल रहा है: `` $ जो usleep / usr / bin / usleep $ rpm -qf / usr / bin / usleep initscripts-9.49.37-1 .el7_3.1.x86_64 `` को संक्षेप में प्रस्तुत करने के लिए। : - sleep( कोरुटिल्स से ) सेकंड के साथ काम करता है - usleep( इनस्क्रिप्ट से ) माइक्रो-सेकंड के साथ काम करता है
लुइस वाज़केज़

4

मुझे एक ही समस्या थी (सोलारिस पर कोई शेल नहीं) इसलिए मैंने अपना स्वयं का इस प्रकार लिखा:

  #include "stdio.h"
  int main(int argc, char **argv) {
     if(argc == 2) { usleep(atoi(argv[1])); }
     return 0;
}

तर्कों की जाँच न करें - यदि आप इसे रखना चाहते हैं तो मैं ठीक से लिखा हुआ सुझाव दूंगा, लेकिन वह (जीसीसी usleep.c -o usleep) आपको एक छेद से बाहर निकाल देगा।


1
आप कम से कम उस सरणी की सीमा से बाहर अनुक्रमण से बचने के usleep()लिए नंगे कॉल को बदल if(argc == 1) { usleep(atoi(argv[1])); }सकते हैं, जिससे किसी भी अप्रत्याशित व्यवहार की संख्या हो सकती है।
एक CVn

@aCVn यह वास्तव में है if (argc == 2) { usleep(atoi(argv[1])); }...
अंगूठी

यह भी ध्यान दें कि usleepइकाई μ है, इसलिए 1 सेकंड प्रतीक्षा करने के लिए, आपको 1000000 तर्क प्रदान करने की आवश्यकता है।
अंगूठी Ø

@ रिंगो राइट। मूर्खतापूर्ण गलती, अच्छी पकड़।
बजे एक CVn

atoi()एक स्ट्रिंग को एक में बदलने के लिए एक भयानक विकल्प है int। क्या atoi( "STRING" )लौटाता है? atoi()किसी भी त्रुटि को वापस करने का कोई तरीका नहीं है।
एंड्रयू हेनले

0

मुझे विस्मयकारी विचार पसंद है, लेकिन मैं इसके तहत टिप्पणी नहीं कर सकता। चूँकि इससे मुझे मदद मिली, मुझे उम्मीद है कि मेरे सुझाव से हमारे विचार सुधर सकते हैं।

https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c redhat इकोसिस्टम पर usleep.c के लिए वास्तविक स्रोत कोड है।

संकलन करने की कोशिश करें कि आपके सोलारिस में। आपको शायद https://www.opencsw.org/packages/libpopt0/ की आवश्यकता होगी ।

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