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


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

# wait one second please 
sleep 1

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

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

105
2018-01-15 13:19


मूल


क्या मैं पूछ सकता हूं कि आप 1ms के लिए क्यों सोना चाहते हैं? - Tom O'Connor
हां, ज़ाहिर है, मेरी बैश स्क्रिप्ट में मैं कुछ पंक्तियों में "नींद 1" जोड़ता हूं, लेकिन स्क्रिप्ट बहुत धीमी गति से चलती है, इसलिए कुछ निष्कर्ष के बाद मैं गणना करता हूं कि नींद 0.1 भी अच्छे परिणाम लाती है और अधिक तेज़ी से देरी के बारे में, मुझे देरी की आवश्यकता होती है मेरी बैश स्क्रिप्ट में एसएसएच समस्या को हल करने के लिए, मैं कुछ मशीनों को पैरालेल एसएसएच लॉगिन करने की अपेक्षा करता हूं और देरी के बिना काम नहीं करेगा, जैसा कि आप मेरे प्रश्न से जानते हैं कि देरी दोनों लिनक्स और सोलारिस - yael
जो भी समाधान आप चुनते हैं, ध्यान रखें कि एक शेल स्क्रिप्ट समय के संदर्भ में बहुत सटीक नहीं होगी। - scai
कुछ ऐसा करने के बारे में जो निष्पादित करने में बहुत कम समय लेता है, लेकिन कुछ भी नहीं .. जैसा echo "" >/dev/null - Tom O'Connor
अच्छा विचार है कि यह आदेश कैसे msec लेते हैं? તે कर कर कर તે कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर - yael


जवाब:


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

$ 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) सभी लोडबेल अब डिफ़ॉल्ट रूप से बनाए गए प्लेटफॉर्म पर बनाए और स्थापित किए गए हैं, हालांकि वे अलग साझा-ऑब्जेक्ट फ़ाइलों के रूप में बनाए गए हैं, और बिना .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 जीएनयू कोर्यूटिल्स से, यह आवश्यक सुविधा का समर्थन करता है। पॉज़िक्स sleep कमांड न्यूनतम है, पुराने सोलारिस संस्करण केवल लागू किए गए हैं। सोलारिस 11 sleep  कर देता है आंशिक सेकंड का समर्थन करें।

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

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

59
2018-01-15 13:52



आह, चूंकि आप इसका उपयोग कर रहे हैं expect आप शायद बस "after Nकर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर - mr.spuratic
उपयोग usleep कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर - Ilan.K


के लिए प्रलेखन sleep से आदेश coreutils कहते हैं:

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

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


103
2018-01-15 13:22



सोलार्स ओएस के बारे में मेरी टिप्पणी देखें - yael
क्या आप मिश्रण करते थे है तथा नहीं है? - scai
मेरे quastion में मेरा अद्यतन देखें - yael
हाँ, मुझे लगता है कि अभी भी आपके प्रश्न में बहुत से नकारात्मक हैं; તે कर તે कर कर તે कर તે कर कर आ कर कर कर कर आ कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर - MadHatter
उदाहरण के लिए - मैं सौरइस 10 पर चलता हूं: # नींद 0.1 नींद: तर्क में खराब चरित्र, लिनक्स नींद के बारे में 0.1 ठीक काम करता है - yael


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

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

 sleep 0.5

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

sleep 0.01

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

sleep 0.001

46
2018-01-15 13:24



તે તે कर आ कर कर તે आ कर कर તે आ कर कर कर તે कर कर कर कर कर कर कर कर कर कर स्थान कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर जैसे। sleep .5 - Mike Causer
के अलावा mathforum.org/library/drmath/view/52352.html - stark
हर किसी के बारे में बात करने के बारे में बात करें ... - Martin


सटीकता निर्धारित करने के लिए इसे आजमाएं:

    time sleep 0.5      # 500 milliseconds (1/2 of a second)
    time sleep 0.001    # 1 millisecond (1/1000 of a second)
    time sleep 1.0      # 1 second (1000 milliseconds)

का संयोजन mr.spuratic समाधान तथा कोल्स का समाधान


11
2018-06-22 19:52





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

usleep 1000

6
2017-07-08 13:55



$ usleep  No command 'usleep' found, did you mean:  Command 'sleep' from package 'coreutils' (main)  usleep: command not found - Bulletmagnet
नहीं मेरा मतलब usleep का हिस्सा initscripts कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कर कम से कम आरएचईएल, सेंटोस, फेडोरा, मगेरिया / मैनड्रिवा और एसयूएसई सहित। यहां एक उदाहरण: `` `` ` - Luis Vazquez
यहां CentOS 7: `` `$ में चलने वाला एक नमूना चित्रण है जो यूएस / आरआरपी / यूएसएफ / बिन / सोई स्क्रिप्ट्स -9.49.37-1.el7_3.1.x86_64` `सारांशित करने के लिए सो जाता है : - sleep (से coreutils) सेकंड के साथ काम करता है - usleep (से initscripts) माइक्रो सेकंड के साथ काम करता है - Luis Vazquez


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

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

तर्कों की जांच नहीं करता है - अगर आप इसे रखना चाहते हैं तो मैं एक उचित लिखित एक की सिफारिश करता हूं लेकिन वह (gcc usleep.c -o usleep) आपको एक छेद से बाहर ले जाएगा।


3
2018-05-24 15:12



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