มีการทดแทนทางเลือกหรือเทคนิคทุบตีสำหรับการชะลอคำสั่งโดยไม่ใช้sleepหรือไม่? ตัวอย่างเช่นการแสดงคำสั่งด้านล่างโดยไม่ใช้สลีปจริง:
$ sleep 10 && echo "This is a test"
atอาจเป็นหนึ่ง แต่ฉันไม่พบตัวอย่างการใช้งานใด ๆ
มีการทดแทนทางเลือกหรือเทคนิคทุบตีสำหรับการชะลอคำสั่งโดยไม่ใช้sleepหรือไม่? ตัวอย่างเช่นการแสดงคำสั่งด้านล่างโดยไม่ใช้สลีปจริง:
$ sleep 10 && echo "This is a test"
atอาจเป็นหนึ่ง แต่ฉันไม่พบตัวอย่างการใช้งานใด ๆ
คำตอบ:
คุณมีทางเลือกในการsleep: พวกเขาและat cronตรงกันข้ามกับsleepสิ่งเหล่านี้คุณต้องให้เวลาที่คุณต้องการให้พวกเขาทำงาน
ให้แน่ใจว่าบริการกำลังทำงานโดยการดำเนินการatd
ตอนนี้สมมติว่าวันที่ 11:17 น. UTC ถ้าคุณจำเป็นต้องดำเนินการคำสั่งที่ 11:25 UTC ไวยากรณ์คือ:
พึงระลึกไว้ว่าโดยค่าเริ่มต้นจะไม่ทำการบันทึกงานที่เสร็จสมบูรณ์ สำหรับอ้างอิงเพิ่มเติมลิงค์นี้ จะดีกว่าที่แอปพลิเคชันของคุณมีการบันทึกของตัวเองservice atd statusecho "This is a test" | at 11:25atd
คุณสามารถกำหนดเวลางานcronเพื่ออ้างอิงเพิ่มเติม: man cronเพื่อดูตัวเลือกหรือcrontab -eเพิ่มงานใหม่ /var/log/cronสามารถตรวจสอบข้อมูลเกี่ยวกับการดำเนินการกับงานได้
FYI sleep system call ระงับการดำเนินการปัจจุบันและกำหนดเวลาให้อาร์กิวเมนต์โต้แย้งผ่านไป
แก้ไข:
ในฐานะที่เป็น @Gaius กล่าวถึงคุณยังสามารถเพิ่มเวลานาทีเพื่อatcommand.But ช่วยบอกเวลาและตอนนี้คุณวิ่งจัดตารางเวลาที่มี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
ด้วยbashbuiltins คุณสามารถทำได้:
coproc read -t 10 && wait "$!" || true
การนอนหลับเป็นเวลา 10 sleepวินาทีโดยไม่ต้องใช้ สิ่งที่coprocต้องทำเพื่อให้readstdin เป็นท่อที่ไม่มีอะไรจะออกมา || trueเป็นเพราะwaitสถานะทางออกของจะสะท้อนถึงการส่งมอบ SIGALRM ซึ่งจะทำให้เชลล์ออกหากerrexitตั้งค่าตัวเลือก
ในเปลือกหอยอื่น ๆ :
mkshและksh93มีsleepอยู่แล้วภายในไม่มีประโยชน์ในการใช้สิ่งอื่นที่นั่น (แม้ว่าพวกเขาทั้งสองจะรองรับread -t)
zshยังรองรับread -tแต่ยังมี wrapper builtin select()ดังนั้นคุณสามารถใช้:
zmodload zsh/zselect
zselect -t 1000 # centiseconds
หากสิ่งที่คุณต้องการคือกำหนดเวลาให้สิ่งต่าง ๆ ถูกเรียกใช้จากเซสชันเชลล์แบบโต้ตอบให้ดูzsh/schedโมดูลzshด้วย
read -t 10 < /dev/zero || trueไหม
readที่จะใช้งานโดยเลือก (2) หรือบางสิ่งที่คล้ายกัน ฉันแสดงความประหลาดใจมากกว่าที่จะแย้งคุณ แต่คุณสามารถชี้ไปที่การอภิปรายเพิ่มเติมนี้ได้หรือไม่?
/dev/zeroเป็นไฟล์ที่มีจำนวนข้อมูลไม่สิ้นสุด (NUL ไบต์) ดังนั้นreadจะอ่านมากที่สุดเท่าที่จะทำได้ในช่วง 10 วินาทีนั้น โชคดีที่ในกรณีbashที่ไม่รองรับการจัดเก็บ NUL ไบต์ในตัวแปรซึ่งจะไม่ใช้หน่วยความจำใด ๆ แต่จะยังคงเป็นทรัพยากรของ CPU
/dev/stdoutจะเป็นอุปกรณ์ tty ดังนั้นมันจะมีผลข้างเคียง (เช่นหยุดสคริปต์ถ้าทำงานในพื้นหลัง) และจะกลับมาถ้าผู้ใช้กดป้อนเช่น read -t 10 /dev/stdout | :จะทำงานบน Linux แต่บน Linux เท่านั้นในขณะที่coprocควรทำงานโดยไม่คำนึงถึงระบบปฏิบัติการ
ความคิดอื่น ๆ
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
เนื่องจากมีคำตอบที่แนะนำให้ใช้-t delayตัวเลือกที่ไม่ได้มาตรฐานreadนี่คือวิธีอ่านการหมดเวลาในเชลล์มาตรฐาน:
{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }
อาร์กิวเมนต์ที่stty timeอยู่ในสิบส่วนของวินาที
การใช้ตัวแปรในตัวของ bash $SECONDSและ busy-loop:
for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
bash ; zshและmkshมีปัญหาที่คล้ายกัน แต่ได้รับการแก้ไขตั้งแต่)
เคล็ดลับที่เก่าแก่ที่สุดในหนังสือ:
read && echo "This is a test"
เพียงแค่กดEnterและมันจะดำเนินต่อไป!
sleep) และขอทางเลือกอื่นที่เทียบเท่าโดยไม่ต้อง ดังนั้นreadอย่าแยกวิเคราะห์ขอโทษ ;)
--- press «enter» to continue --- ;-) ที่ดีที่สุด
ย้อนกลับไปในสมัยของไมโครคอมพิวเตอร์ที่ใช้งาน BASIC ความล่าช้ามักเกิดขึ้นได้ด้วยการวนซ้ำที่ว่างเปล่า:
FOR I = 1 TO 10000:NEXT
หลักการเดียวกันนี้สามารถใช้เพื่อแทรกการหน่วงเวลาในเชลล์สคริปต์:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
แน่นอนปัญหาด้วยวิธีนี้คือความยาวของการหน่วงเวลาจะแตกต่างกันไปตามเครื่องกับเครื่องตามความเร็วโปรเซสเซอร์ (หรือแม้กระทั่งในเครื่องเดียวกันภายใต้การโหลดที่แตกต่างกัน) ซึ่งแตกต่างจากsleepมันอาจจะสูงสุด CPU ของคุณ (หรือหนึ่งในแกนของมัน)
ไม่มีในตัวที่ทำเช่นเดียวกับsleep(เว้นแต่sleepจะมีในตัว) อย่างไรก็ตามมีคำสั่งอื่น ๆ ที่จะรอ
รวมถึงไม่กี่
atและcron: ใช้เพื่อกำหนดเวลางานในเวลาที่กำหนด
inotifywait: ใช้เพื่อรอไฟล์หรือไฟล์ที่จะแก้ไข / ลบ / เพิ่ม / ฯลฯ
at?
cronจัดเก็บงานในcrontabใช่มั้ย สถานที่ที่ไม่atจัดเก็บข้อมูลที่กำหนดไว้หรือไม่
คลาสสิกจากดินแดนแห่ง Windows และรุ่นที่:
ping -c 11 localhost >/dev/null && echo "This is a test"
หากคุณต้องการรอการโต้ตอบบรรทัดใหม่ในไฟล์แล้ว
tail -f.
กำลังรอการเปลี่ยนแปลงในระบบไฟล์หรือไม่? จากนั้นใช้เช่น
inotify / inoticoming.
และมีตัวเลือกอื่น ๆ ขึ้นอยู่กับสิ่งที่คุณหมายถึงด้วย "รอ"
sleep?