İ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 -t
seçeneğini kullanmaktır .sysread
your-command
your-command
Çıkışını bir boru haline getirdiğine dikkat edin . your-command
Bir 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 zpty
yerine coproc
bir terminal çıkış sahte.
İle bash
, güvenmeniz dd
ve timeout
varsa 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, coproc
iş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ş zsh
ya ksh93
çünkü $!
pid içermiyor your-command
orada).