J'ai un utilitaire qui a une mauvaise habitude de restr calme et de restr là, je sais déjà combien de time dans le process il le fait donc j'utilise timeout
pour lutter contre cela, mais parfois il le fait avant ce moment. Existe-t-il un outil similaire à timeout
qui va tuer le process s'il arrête de diriger la sortie vers stdout?
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'option -t
de sysread
pour lire à partir de your-command
sortie de your-command
avec un timeout.
Notez qu'il fait de your-command
sortie de your-command
un canal. Il se peut que your-command
commence à mettre en memory tampon sa sortie quand elle ne va pas à un terminal, auquel cas vous pouvez find qu'il ne sort pas quelque chose, mais seulement à cause de cette mise en memory tampon .
Vous pourriez contourner cela en utilisant stdbuf -oL your-command
pour restaurer le stdbuf -oL your-command
de ligne (si votre command utilise stdio) ou utiliser zpty
au lieu de coproc
pour coproc
une sortie de terminal.
Avec bash
, vous devrez countr sur dd
et le timeout
GNU 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 process:
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 marchera pas dans zsh
ou ksh93
car $!
ne contient pas le pid de your-command
).
Je redirectais STDOUT vers un file, puis j'utiliserais les tests d'horodatage de monit pour redémarrer le process si le mtime du file est supérieur à un seuil.