שאלה איך אני ישן במשך אלפית שנייה בבאש או בקש


שינה היא פקודה מאוד פופולרי ואנחנו יכולים להתחיל לישון מ 1 שנייה:

# wait one second please 
sleep 1

אבל מה חלופה אם אני צריך לחכות רק 0.1 שניות או בין 0.1 ל 1 השני?

  • הערה: על לינוקס או OS X sleep 0.XXX עובד בסדר, אבל על סולאריס sleep 0.1 או sleep 0.01 - תחביר לא חוקי

105
2018-01-15 13:19




האם אני יכול לשאול למה אתה רוצה לישון עבור 1ms? - Tom O'Connor
כן כמובן, בתסריט bash אני מוסיף "לישון 1", בכמה שורות, אבל התסריט לרוץ לאט מאוד, אז אחרי כמה מסקנה אני לחשב כי שינה 0.1 גם להביא תוצאות טובות יותר מהר יותר על העיכוב, אני צריך עיכוב בסדר כדי לפתור את הבעיה SSH בתסריט bash שלי, אני מבצע ssh paralel להיכנס כמה מכונות על ידי לצפות וללא דיחוי זה לא יעבוד, כפי שאתה יודע מהשאלה שלי העיכוב צריך להתאים הן לינוקס סולאריס - yael
לא משנה מה הפתרון תבחר, זכור כי סקריפט פגז לא יהיה מדויק מאוד מבחינת תזמון. - scai
מה דעתך לעשות משהו שלוקח זמן קצר מאוד לבצע, אבל עושה כלום .. כמו echo "" >/dev/null - Tom O'Connor
רעיון טוב אבל איך msec פקודה זו לקחת? , אני צריך 0.1 msec, לא פחות אז - :) - 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

החיסרון הוא כי loadables לא יכול להיות מסופק עם שלך bash בינארי, אז אתה צריך לאסוף אותם בעצמך כפי שמוצג (אם כי על Solaris זה לא בהכרח יהיה פשוט כמו לעיל).

החל מ bash-4.4 (ספטמבר 2016) כל loadables בנויים כעת ומתקינים כברירת מחדל על פלטפורמות התומכות בו, למרות שהם בנויים כקובץ אובייקטים משותפים נפרדים, ובלי .so סיומת. אלא אם כן הפיצוץ / OS שלך עשה משהו יצירתי, אתה אמור להיות מסוגל לעשות במקום זאת:

[ -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 הפקודה היא מינימלית, גרסאות קודמות של Solaris מיושמות רק זאת. Solaris 11 sleep  עושה תמיכה בשברים שבריריים.

כמוצא אחרון אתה יכול להשתמש perl (או כל scripting אחר שאתה צריך למסור) עם אזהרה כי Initising המתורגמן ניתן להשוות את זמן השינה המיועד:

$ 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 כמו @ לואיס Vazquez ו @sebix לכתוב - Ilan.K


התיעוד עבור sleep הפקודה מ הליבה אומר:

מימושים היסטוריים של שינה יש צורך במספר זה להיות   שלם, וקיבל רק ארגומנט יחיד ללא סיומת.   עם זאת, שנת GNU מקבלת מספרים נקודה שרירותית. ראה    נקודה צפה.

לפיכך אתה יכול להשתמש sleep 0.1, sleep 1.0e-1 וטענות דומות.


103
2018-01-15 13:22



לראות את ההערה שלי על מערכת ההפעלה - yael
האם התערבבת J ו לא? - scai
לראות את העדכון שלי quastion - yael
יעל, אני חושב שיש עדיין שאלה שלילית אחת מדי בשאלה שלך. אתה בטוח שאתה מתכוון "לא תחביר לא חוקי"? - MadHatter
לדוגמה - אני רץ על Solaris 10 זה: # שינה 0.1 שינה: אופי רע בטיעון, על שינה לינוקס 0.1 עובד בסדר - yael


Sleep מקבל מספרים עשרוניים כדי שתוכל לשבור אותו כך:

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
לדבר על כל השאר overcomplicating את זה ... - 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
הנה אילוסטרציה לדוגמה המופיעה ב- CentOS 7: `` $ אשר ישנים / usr / bin / weleep $ rpm -qf / usr / bin / weleep initscripts-9.49.37-1.el7_3.1.x86_64 `` לסיכום : - sleep (מ הליבה) עובד עם שניות - usleep (מ תמלילים) עובד עם מיקרו שניות - Luis Vazquez


היתה לי אותה בעיה (ללא פגז לישון על Solaris) אז כתבתי שלי ובכך:

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

לא לבדוק טיעונים - אני ממליץ על כתוב כראוי אחד אם אתה רוצה לשמור את זה אבל (ג 'ק usleep.c - ללא שינה) יוציא אותך מתוך חור.


3
2018-05-24 15:12



אתה יכול לפחות לשנות את זה חשוף usleep() לקרוא ל if(argc == 1) { usleep(atoi(argv[1])); } כדי למנוע יצירת אינדקס מחוץ לגבולות המערך, אשר יכול להוביל לכל מספר של התנהגויות בלתי צפויות. - α CVn