Tuer un process s'il se tait pendant un certain time

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.