Avec zsh
, vous pourriez faire:
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
L'idée étant d'utiliser l' -t
option de sysread
lire depuis la your-command
sortie avec un timeout.
Notez qu'il fait de your-command
la sortie un tube. Il se peut que cela your-command
commence à mettre en mémoire tampon sa sortie quand il ne va pas à un terminal, auquel cas vous pouvez constater qu'il ne sort rien quoi que ce soit dans un certain temps, mais uniquement à cause de cette mise en mémoire tampon, pas parce qu'il est suspendu d'une manière ou d'une autre.
Vous pouvez contourner cela en utilisant stdbuf -oL your-command
pour restaurer la mise en mémoire tampon de ligne (si votre commande utilise stdio) ou utiliser zpty
au lieu de coproc
pour simuler une sortie de terminal.
Avec bash
, vous devrez vous fier à dd
GNU timeout
si disponible:
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
Au lieu de coproc
, vous pouvez également utiliser la substitution de processus:
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)
(cela ne fonctionnera pas dans zsh
ou ksh93
parce $!
qu'il ne contient pas le pid de your-command
là).
Je redirigerais STDOUT vers un fichier, puis j'utiliserais les tests d'horodatage de monit pour redémarrer le processus si le mtime du fichier est supérieur à un seuil.
la source