Interactive App: Certifique-se de que determinada saída é encontrada a cada 30 minutos

1

Então, devido a algumas escolhas muito ruins de design, eu me deparo com um aplicativo de console interativo complexo e insubstituível rodando para sempre em uma máquina Debian.

Este aplicativo realiza algumas tarefas repetidamente e retorna para stdout resultados como:

InvetoryOpt: Finished
PBridged: Finished
FLoot: ERROR

Eu preciso ter certeza de que a cada x minutos eu recebo a string InvetoryOpt: Finished na saída do programa. Se não, eu preciso matá-lo, executar outro script, iniciar o programa novamente e verificar.

Como posso conseguir isso? Eu estava pensando em expect , mas não tenho muita experiência com isso e não tenho certeza se posso verificar se a saída corresponde à string a cada x minutos.

Notas:

  • O programa também gera muitos outros tipos de lixo que eu não me importo;
  • O programa pode gerar a mesma string InvetoryOpt: Finished várias vezes em 30 minutos ou simplesmente não produzir nada. Portanto, seguir o final de um arquivo não o fará porque corresponderia à última saída dessa string.

Obrigado.

    
por TCB13 25.07.2016 / 16:06

1 resposta

1

Você pode usar o script abaixo como um controlador de wrapper. Eu assumo bash é conhecido, então não há comentários técnicos. Eu posso adicioná-los se você quiser.

As variáveis PROGRAM e OTHER_SCRIPT para o script que você mencionou precisam ser definidas.

O controle de tempo é rígido, ou seja. Ele não redefine a contagem regressiva para o último tempo de mensagem de InvetoryOpt: Finished , apenas verifica a cada 30 minutos. Eu posso pensar em uma maneira de melhorar isso se você precisar.

ATUALIZAÇÃO: Armadilha adicionada.

#!/usr/bin/env bash

trap '
kill %1
rm $OUT
exit
' 2

#provide the program command below
PROGRAM=
#provide the other script below
OTHER_SCRIPT=
PHRASE="InvetoryOpt: Finished"
INTERVAL=1800
OUT=/tmp/out$$

message () {
    echo "$(basename "$0")": "$1"
}

start_app () {
    eval "$PROGRAM | tee $OUT &"
}

action () {
    if ! grep -q -e "$PHRASE" $OUT
    then
        message "Check failed. Restarting." >&2
        kill %1
        eval "$OTHER_SCRIPT"
        start_app
    else
        message "All fine."
    fi
    > $OUT
}

start_app
while true
    do {
        sleep $INTERVAL
        action
    }
    done
    
por 26.07.2016 / 03:09