Dzięki zsh
możesz wykonać:
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
Chodzi o to, aby użyć -t
opcji sysread
odczytu z your-command
wyniku z przekroczeniem limitu czasu.
Zauważ, że czyni your-command
to wyjście potokiem. Może się zdarzyć, że your-command
zacznie buforować dane wyjściowe, gdy nie przejdzie do terminala, w którym to przypadku może się okazać, że przez jakiś czas nic nie wyświetla, ale tylko z powodu buforowania, a nie dlatego, że w jakiś sposób został zawieszony .
Możesz obejść ten problem, używając stdbuf -oL your-command
przywracania buforowania linii (jeśli twoje polecenie używa stdio) lub użyj zpty
zamiast coproc
sfałszować wyjście terminala.
Z bash
, będziesz musiał polegać na dd
GNU, timeout
jeśli jest dostępny:
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
Zamiast tego coproc
możesz również użyć podstawienia procesu:
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)
(to nie zadziała zsh
lub ksh93
ponieważ $!
nie zawiera pid your-command
tam).