回答:
を使用すると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
を使用して端末出力を偽造することで回避できます。
を使用する場合、利用可能であればGNU bash
に依存する必要がdd
あり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
か、そこにpidが含まれていないksh93
ため)。$!
your-command
STDOUTをファイルにリダイレクトし、ファイルのmtimeがしきい値より大きい場合は、monitのタイムスタンプテストを使用してプロセスを再起動します。