มีการทดแทนทางเลือกหรือเทคนิคทุบตีสำหรับการชะลอคำสั่งโดยไม่ใช้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 status
echo "This is a test" | at 11:25
atd
คุณสามารถกำหนดเวลางานcron
เพื่ออ้างอิงเพิ่มเติม: man cron
เพื่อดูตัวเลือกหรือcrontab -e
เพิ่มงานใหม่ /var/log/cron
สามารถตรวจสอบข้อมูลเกี่ยวกับการดำเนินการกับงานได้
FYI sleep system call
ระงับการดำเนินการปัจจุบันและกำหนดเวลาให้อาร์กิวเมนต์โต้แย้งผ่านไป
แก้ไข:
ในฐานะที่เป็น @Gaius กล่าวถึงคุณยังสามารถเพิ่มเวลานาทีเพื่อat
command.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
ด้วยbash
builtins คุณสามารถทำได้:
coproc read -t 10 && wait "$!" || true
การนอนหลับเป็นเวลา 10 sleep
วินาทีโดยไม่ต้องใช้ สิ่งที่coproc
ต้องทำเพื่อให้read
stdin เป็นท่อที่ไม่มีอะไรจะออกมา || 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
?