Kill processo quando ele pára para produzir mais saída

5

Existe uma ferramenta de shell que pode investigar se um subprocesso ainda está produzindo uma saída e, de outra forma, matá-lo após um tempo limite especificado?

Estou usando offlineimap para o backup do Gmail, mas isso é muito muito muito esquisito. O processamento é interrompido regularmente devido a condições IMAP ou o que quer que seja. O processo precisa ser constantemente reiniciado para ver qualquer progresso. Por isso, estou usando atualmente:

(ulimit -t 300 ; offlineimap)

em um loop. Que reinicia a ferramenta a cada cinco minutos; não importa o que.

Isso é um pouco insatisfatório, já que ele mata o processo prematuramente nas poucas vezes em que ainda está realizando algum trabalho, ou ainda espera 4 minutos a mais quando já está bloqueando. Eu preferiria ter algo como:

offlineimap > output.log &
stillmakingoutput? --timeout 60 output.log || kill $!

Isso provavelmente é possível com um script exec / watching personalizado, mas não há uma abordagem genérica para esses casos?


    
por mario 25.07.2011 / 13:12

3 respostas

2

Foi bem sucedido com um script de tempo limite "pequeno" que verifica o tamanho do arquivo de log para determinar se o processo ainda está funcionando. Não é bonita, mas ajudou:

#!/bin/sh
TIMEOUT=$1
FILE=$2
PID=$3
if [ -z "$PID" ]
then
   echo $0 timeout file pid
   echo "     e.g. 60 /tmp/log 16325"
   exit
fi
echo "stalekill: timeout=$TIMEOUT file=$FILE pid=$PID"    

sleep 1

SIZE=0
while true
do
   sleep 3

   NEWSIZE=$(stat -c%s "$FILE")
   if [ "$NEWSIZE" -eq "$SIZE" ]
   then
      echo "stalekill '$FILE' unchanged; $SIZE"

      sleep $TIMEOUT
      NEWSIZE=$(stat -c%s "$FILE")

      if [ "$NEWSIZE" -eq "$SIZE" ]
      then
         kill $PID || sleep 2 && kill -9 $PID
         exit
      fi
      echo "stalekill '$FILE' changed; $SIZE..$NEWSIZE"
   else
      echo "stalekill '$FILE' changed; $SIZE..$NEWSIZE"
   fi
   SIZE=$NEWSIZE 
done

Chamada da seguinte forma (em um loop):

./offlineimap.py >> ./log.txt 2>&1   &   stalekill 25 ./log.txt $!

O tempo não é excessivamente profissional, e seria ainda melhor se ele também verificasse se o processo já havia terminado; mas basicamente fez o feito.

Mas, mesmo assim, se alguém souber uma solução diferente ou mais padronizada para essa tarefa: accepted answer tick still available .

    
por 25.07.2011 / 22:04
1

Dê uma chance ao link . Você pode definir o tempo limite para cada conta IMAP.

    
por 25.07.2011 / 21:19
0

Você pode querer dar uma olhada em Monit , que provavelmente pode fazer o que você está procurando.

    
por 25.07.2011 / 15:26