Script de shell para reiniciar um processo se ele gerar um determinado texto

3

Eu tenho um programa python que, de tempos em tempos, falha com várias exceções diferentes, geralmente devido a problemas de rede. A única maneira de fazê-lo funcionar é reiniciá-lo. Como eu iria escrever um script de shell para executar o processo, verificar continuamente se alguma saída diz Error e, se assim for, encerrar o processo e reiniciar o comando (vamos chamá-lo de ./command.sh )?

Seria bom que isso estivesse em qualquer outra linguagem (python / perl etc).

    
por Callum Rogers 14.06.2011 / 19:55

2 respostas

3

Como o python sai com um código de retorno! = 0 quando lança uma exceção, você pode simplesmente executar este script de shell:

while ! ./command.sh ; do : ; done

Claro que se você quiser apenas executar o comando o tempo todo, basta escrever:

while true ; do ./command.sh ; done

(isto assume ./command.sh não bifurca e sai)

    
por jmuc 14.06.2011 / 20:30
2

Eu fiz algo parecido para recuperar o ted (Torrent Episode Downloader) de suas falhas regulares. Abaixo está o script que usei. Vai explicar em mais edições como eu vou.

Edit: como funciona

Ted tem um arquivo de log. Como ele verifica novos episódios a cada meia hora, há um registro de data e hora nesse registro, que não é mais do que meia hora. Claro que o timestamp não está lá se o ted falhou no tempo médio.

Edit: Como isso pode ajudar você

Você pode redirecionar a saída do seu programa problemático para um arquivo. Escreva um script semelhante ao meu, que verifica esse arquivo. Se encontrar a cadeia incorreta, reinicia o aplicativo (e remove o arquivo de saída). Você pode executar o script em um loop infinito ou usar o cron. Eu escolhi usar o cron para ter menos poluição do processo e as verificações não precisam ser incrivelmente frequentes de qualquer maneira.

#!/bin/bash
# indent-mode: spaces, indentsize: 4, encoding: utf-8
# © 2011 [email protected].
# Use permitted under MIT license:
# http://www.opensource.org/licenses/mit-license.php (NO WARRANTY IMPLIED)

teddir='/home/confus/ted'   # Location of the ted executable
logpath='/home/confus/.Torrent Episode Downloader/log.txt' # Location of ted's log

# Get the process id for ted so it can be killed later
pid=$(lsof "$teddir/ted.jar" | grep -m1 java )
set -- $pid
pid=
echo "Ted is running unter pid: $pid."

# Check if the log is recent
search=$(date "+%b %d, %Y @ {0,1}%l:[0-9]{2} %p")
search=$(cat "$logpath" | grep -oE "$search")

# If ted is running and the log is not recent, kill crashed process and
#+restart it.
if [ -n "$pid" ] && [ ! -n "$search" ]; then
    echo "Killig $pid."
    kill "$pid" || exit 1
    echo "Restarting ted..."
    cd "$teddir"
    /usr/bin/java -jar ted.jar noTray
fi

exit 0

No meu caso, ainda havia um processo ativo para o ted após o travamento, mas ted não estava fazendo nada. Mata o seu processo, então você pode, claro, pular as partes pid.

P.S. Pode ou não ser um código ruim. Pode haver uma maneira muito melhor, mas funciona, e eu o reúno em um tempo muito curto.

    
por con-f-use 14.06.2011 / 20:27