İle zshşunları yapabilirsiniz:
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
Fikir , çıktıdan zaman aşımı ile okuma -tseçeneğini kullanmaktır .sysreadyour-command
your-commandÇıkışını bir boru haline getirdiğine dikkat edin . your-commandBir terminale gitmediğinde çıkışını tamponlamaya başlayabilir , bu durumda bir süre hiçbir şey vermediğini fark edebilirsiniz, ancak sadece bu tamponlama nedeniyle, bir şekilde asılı olduğu için değil .
Sen kullanarak bu geçici bir çözüm olabilir stdbuf -oL your-command(your-komutun kullandığı stdio ise) hat-arabelleğe geri yüklemek veya kullanmak zptyyerine coprocbir terminal çıkış sahte.
İle bash, güvenmeniz ddve timeoutvarsa GNU :
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
Bunun yerine, coprocişlem ikamesini de kullanabilirsiniz:
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)
(o olmaz iş zshya ksh93çünkü $!pid içermiyor your-commandorada).