Mit zsh
könnten Sie tun:
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
Die Idee war, die -t
Option sysread
zu verwenden, your-command
mit einem Timeout aus der Ausgabe zu lesen .
Beachten Sie, dass die your-command
Ausgabe dadurch zu einer Pipe wird. Es kann sein, dass your-command
die Ausgabe gepuffert wird, wenn sie nicht an ein Terminal gesendet wird. In diesem Fall stellen Sie möglicherweise fest, dass sie in einer Weile nichts mehr ausgibt, sondern nur aufgrund dieser Pufferung, nicht weil sie irgendwie hängen bleibt.
Sie können dies umgehen, indem stdbuf -oL your-command
Sie die Zeilenpufferung wiederherstellen (wenn Ihr Befehl stdio verwendet) oder zpty
stattdessen coproc
eine Terminalausgabe fälschen.
Mit bash
müssten Sie sich auf dd
und GNU verlassen, timeout
falls verfügbar:
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
Stattdessen coproc
können Sie auch die Prozessersetzung verwenden:
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)
(das funktioniert nicht in zsh
oder ksh93
weil $!
es nicht die PID von your-command
dort enthält).