Meu loop está parando, mas não consigo entender por que

0

Aqui está a situação ... Eu tenho um programa que estou executando em vinho. Este programa irá, por vezes, travar .. Eu queria criar um 'script de monitoramento' para assisti-lo e matá-lo e reiniciá-lo se ele travar. Eu consegui isso para encontrar o processo e matá-lo se ele travar, mas o script para naquele ponto sem terminar ... o final seria dormir por 30 segundos e depois iniciar o programa novamente ... mas em vez disso ... o script simplesmente para

Primeiro de tudo, eu vou dizer que sou muito ruim em escrever coisas como esta ... isso é de coisas do googling e colocá-las em um arquivo e tentar fazê-lo fazer o que eu quero: D

Aqui está o que eu tenho .. é um pouco desleixado e provavelmente pode ser limpo ...

#!/bin/bash

CPU_USAGE_THRESHOLD="120"
TOPPROCESS="0"
i="1"
re='^[0-9]+([.][0-9]+)?$'

while [ $i -eq 1 ]; do
         MYPROCESS=$(ps aux --sort=-pcpu | grep -v %CPU | head -n 1 | cut -d"." -f1 | cut -d" " -f7)
         MYPROCESS2=$(ps aux --sort=-pcpu | grep -v %CPU | head -n 1 | cut -d"." -f1 | cut -d" " -f6)
if ! [[ $MYPROCESS2 =~ $re ]] ; then
          >&2;
     else
     if [ "$MYPROCESS2" -gt "1" ]; then
        TOPPROCESS="$MYPROCESS2"
        echo "the calculated top process2 is $TOPPROCESS" 
        echo "the usage threshold is $CPU_USAGE_THRESHOLD";
     fi
fi
if ! [[ $MYPROCESS =~ $re ]] ; then
          >&2;
     else
     if [ "$MYPROCESS" -gt "1" ]; then
        TOPPROCESS="$MYPROCESS"
        echo "the calculated top process is $TOPPROCESS" 
        echo "the usage threshold is $CPU_USAGE_THRESHOLD"; 
     fi
fi 
if [ "$TOPPROCESS" -gt "$CPU_USAGE_THRESHOLD" ]; then 
    exec pkill SAMBC.exe;
    echo "process killed"
        sleep 30 
        exec wine C:\SAMBC\SAMBC.exe
        sleep 60
        i="1"
 else
    sleep 60
    i="1"
    fi
done

O resultado disso parece que ele pára de matar o processo ... Eu recebo isso como resultado se eu executar isso a partir de um prompt de comando.

{~}:$ monitorsam
the calculated top process2 is 121
the usage threshold is 120
{~}:$

Parece parar depois do kill porque não echo "process killed" A razão pela qual eu tenho process e process2 é por algum motivo que o valor que eu preciso irá aparecer em um ou outro .. Eu acho que depende do que é o seu PID.

Como eu disse, eu sou muito ruim com essas coisas .. Eu realmente não entendo completamente o código que acabei de copiar nas pesquisas do google e encontrei os erros e corrigi-los usando o google .. mas .. ainda realmente don entenda completamente .. apenas uma pequena compreensão ... é provavelmente alguma coisa de ponto e vírgula ou algo que eu estou perdendo, mas eu tentei tudo o que posso pensar.

Ele mata o processo quando ele trava .. mas não o inicia novamente e não continua executando o script do monitoram ... Eu quero que ele reinicie o programa e continue monitorando-o para que ele possa matá-lo e reinicie-o novamente se ele cair novamente.

lol desculpe pelo livro, mas eu queria ter certeza de que eu dava todas as informações que eu podia: D

qualquer ajuda seria apreciada.

    
por John Orion 08.12.2017 / 06:44

1 resposta

3

Algumas coisas:

  • i é sempre 1 no seu script, AFAICT. Portanto, não adianta usá-lo e é mais simples de fazer:

    while true; do
    ...
    done
    
  • Você é exec ing pkill e wine . exec substitui o shell atual pelo comando a ser executado, então seu script termina efetivamente quando exec é qualquer coisa. Apenas faça pkill SAMBC.exe e wine C:\SAMBC\SAMBC.exe . O comando wine pode precisar ser enviado para o segundo plano: wine C:\SAMBC\SAMBC.exe & .

  • Se você deseja obter o uso da CPU de um processo específico, é mais fácil usar pgrep para obter o PID e ps para obter apenas o uso da CPU:

    process_usage=$(ps -o pcpu= $(pgrep SAMBC.exe) | sed 's/\..*//')
    

    O comando sed remove os decimais finais.

Combinando e simplificando:

#!/bin/bash

CPU_USAGE_THRESHOLD="120"

while true; do
    proc_usage=$(ps -o pcpu= $(pgrep SAMBC.exe) | sed 's/\..*//')

    if (( proc_usage > CPU_USAGE_THRESHOLD )); then 
        pkill SAMBC.exe;
        echo "process killed"
        sleep 30 
        wine C:\SAMBC\SAMBC.exe &
    fi
    sleep 60
done
    
por muru 08.12.2017 / 07:10