Dengan zsh
, Anda bisa melakukan:
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
Idenya adalah menggunakan -t
opsi sysread
untuk membaca dari your-command
output dengan batas waktu.
Perhatikan bahwa itu membuat your-command
keluaran menjadi pipa. Mungkin itu your-command
mulai buffering output ketika tidak pergi ke terminal, dalam hal ini Anda mungkin menemukan itu tidak mengeluarkan apa-apa dalam beberapa saat, tetapi hanya karena buffering itu, bukan karena itu tergantung entah bagaimana.
Anda dapat mengatasinya dengan menggunakan stdbuf -oL your-command
untuk mengembalikan garis-buffering (jika perintah Anda menggunakan stdio) atau menggunakan zpty
bukan coproc
untuk memalsukan output terminal.
Dengan bash
, Anda harus mengandalkan dd
dan GNU timeout
jika tersedia:
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
Alih-alih coproc
, Anda juga bisa menggunakan subtitusi proses:
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)
(itu tidak akan berhasil zsh
atau ksh93
karena $!
tidak mengandung pid di your-command
sana).
Saya akan mengarahkan STDOUT ke file dan kemudian menggunakan pengujian cap waktu monit untuk memulai kembali proses jika file mtime lebih besar dari ambang.
sumber