Mate um processo se ele ficar quieto por um certo período de tempo


9

Eu tenho um utilitário que tem o hábito desagradável de ficar quieto e ficar lá, eu já sei quanto tempo o processo faz isso, então estou usando timeoutpara combater isso, mas às vezes ele faz isso antes desse período. Existe uma ferramenta semelhante à timeoutque interromperá o processo se ele parar de direcionar a saída para o stdout?

Respostas:


8

Com zsh, você pode fazer:

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

A ideia é usar a -topção de sysreadler da your-commandsaída com um tempo limite.

Observe que ele faz your-commandda saída um tubo. Pode ser que your-commandcomece a armazenar em buffer sua saída quando ele não for para um terminal; nesse caso, você poderá descobrir que não produz nada há algum tempo, mas apenas por causa desse buffer, não porque está travado de alguma forma.

Você pode contornar isso usando stdbuf -oL your-commandpara restaurar o buffer de linha (se o seu comando usa stdio) ou usar em zptyvez de coprocfalsificar uma saída do terminal.

Com bash, você precisaria confiar no ddGNU, timeoutse disponível:

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

Em vez de coproc, você também pode usar a substituição de processo:

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)

(que não funcionará zshou ksh93porque $!não contém o pid de your-commandlá).


1
Oi! Obrigado, é possível que você possa comentar isso para que eu possa entender o que isso está fazendo?
Benjojo 17/02

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.