ด้วยzsh
คุณสามารถทำ:
zmodload zsh/system
coproc your-command
while :; do
sysread -t 10 -o 1 <&p && continue
if (( $? == 4 )); then
echo "Timeout" >&2
kill $!
fi
break
done
แนวคิดที่จะใช้-t
ตัวเลือกในsysread
การอ่านจากyour-command
ผลลัพธ์ด้วยการหมดเวลา
โปรดทราบว่ามันทำให้your-command
ท่อส่งออก อาจเป็นได้ว่าyour-command
เริ่มต้นบัฟเฟอร์การส่งออกของมันเมื่อมันไม่ได้ไปไปยังสถานีซึ่งในกรณีนี้คุณอาจพบว่ามันทำอะไรไม่ได้การส่งออกในขณะที่ แต่เพียงเพราะบัฟเฟอร์ที่ไม่ได้เพราะมันแขวนอย่างใด
คุณสามารถแก้ไขได้โดยใช้stdbuf -oL your-command
เพื่อคืนค่าการบัฟเฟอร์บรรทัด (ถ้าคำสั่งของคุณใช้ stdio) หรือใช้zpty
แทนcoproc
การปลอมเอาท์พุทเทอร์มินัล
ด้วยbash
คุณจะต้องพึ่งพาdd
และ GNU timeout
ถ้ามี:
coproc your-command
while :; do
timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue
if (($? == 124)); then
echo Timeout >&2
kill "$!"
fi
done
แทนที่จะใช้coproc
คุณสามารถใช้การทดแทนกระบวนการได้:
while :; do
timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue
if (($? == 124)); then
echo Timeout >&2
kill "$!"
fi
done 3< <(your-command)
(ที่จะไม่ทำงานzsh
หรือksh93
เพราะ$!
ไม่มี pid ของที่your-command
นั่น)