سؤال كيف أنام لمدة مليثانية في bash أو ksh


النوم أمر شائع جدًا ويمكننا بدء النوم من ثانية واحدة:

# wait one second please 
sleep 1

ولكن ما هو البديل إذا كنت بحاجة إلى الانتظار فقط 0.1 ثانية أو ما بين 0.1 إلى 1 ثانية؟

  • ملاحظة: على نظام التشغيل Linux أو OS X sleep 0.XXX يعمل بشكل جيد ، ولكن على سولاريس sleep 0.1 أو sleep 0.01 - بناء جملة غير قانوني

105
2018-01-15 13:19


الأصل


هل يمكن أن أسأل لماذا تريد النوم ل 1ms؟ - Tom O'Connor
نعم بالطبع ، في برنامجي bash script أضف "sleep 1" ، في بعض الخطوط ، ولكن البرنامج النصي يعمل ببطء شديد ، لذلك بعد بعض الاستنتاج أحسب أن النوم 0.1 أيضًا يحقق نتائج جيدة وأسرع المزيد حول التأخير ، أحتاج إلى تأخير بالترتيب لحل مشكلة ssh في البرنامج النصي bash بلدي ، وأداء paralel ssh تسجيل الدخول إلى بعض الأجهزة التي تتوقع ودون تأخير لن تنجح ، كما تعلمون من سؤالي يجب أن تناسب التأخير كل من لينكس وسولاريس - yael
مهما كان الحل الذي تختاره ، ضع في اعتبارك أن نصوص shell لن تكون دقيقة جدًا من حيث التوقيت. - scai
ماذا عن القيام بشيء يستغرق وقتًا قصيرًا جدًا لتنفيذه ، ولكنه لا يفعل شيئًا echo "" >/dev/null - Tom O'Connor
فكرة جيدة ولكن كيف msec هذا الأمر؟ ، أحتاج 0.1 مللي ثانية ، وليس أقل من ذلك - :) - yael


الأجوبة:


يمتلك Bash نومًا "قابلًا للتحميل" والذي يدعم الثواني الكسرية ، ويزيل النفقات العامة لأمر خارجي:

$ 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 من غنو coreutils ، وهذا يدعم الميزة المطلوبة. و POSIX 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"، حيث N بالمللي ثانية ، مباشرة في البرنامج النصي الخاص بك. - mr.spuratic
استعمال usleep مثلLuis Vazquez وsebix الكتابة - Ilan.K


وثائق ل sleep الأمر من coreutils يقول:

تطلبت عمليات التنفيذ التاريخية للنوم أن يكون الرقم   عدد صحيح ، وقبلت فقط وسيطة واحدة دون لاحقة.   ومع ذلك ، فإن نوم غنو تقبل أرقامًا عشوائية عشوائية. نرى    النقطة العائمة.

ومن ثم يمكنك استخدامها sleep 0.1، sleep 1.0e-1 والحجج المماثلة.


103
2018-01-15 13:22



انظر ملاحظتي حول SOLARIS OS - 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 الحزمة القياسية على الأقل في جميع توزيعات Red Hat المستمدة ؛ بما في ذلك على الأقل RHEL و CentOS و Fedora و Mageia / Mandriva و SuSE. هنا مثال على ذلك: `` `` - Luis Vazquez
هنا نموذج ilustration يعمل في CentOS 7: `` `$ التي تنام / usr / bin / usleep $ rpm -qf / usr / bin / usleep initscripts-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 sleep) سيخرجك من الثقب.


3
2018-05-24 15:12



يمكنك على الأقل تغيير ذلك العاري usleep() دعوة ل if(argc == 1) { usleep(atoi(argv[1])); } لتجنب الفهرسة خارج حدود الصفيف ، والتي يمكن أن تؤدي إلى أي عدد من السلوكيات غير المتوقعة. - α CVn