回答:
を使用すると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オプションを使用するという考えです。sysreadyour-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のタイムスタンプテストを使用してプロセスを再起動します。