З 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
тому, $!
що не містить your-command
тамтешньої сторінки).