Saindo de um script que reinicia o aplicativo

2

Eu tenho um script de shell bash que usa wait () para determinar se um aplicativo foi encerrado. No entanto, estou tendo dificuldades em eliminar o script / aplicativo quando quiser. A idéia do script é reiniciar o aplicativo se ele morrer ou uma atualização de software precisar acontecer, mas eu preciso de um backdoor ou uma armadilha de sinal para poder eliminá-lo sem reiniciar o aplicativo.

O programa será encerrado se for atualizado e, em seguida, reiniciado, também será reiniciado se o aplicativo sair, não importa o quê. Qual é o que eu preciso. No entanto, eu também preciso de uma maneira especial para finalizar este script, sem reiniciar o aplicativo, para fins especiais

Aqui está o script:

# Initial Launch of the application
/app &

while true
do

   PID=$! #process ID of app

   # The app background process uses exit(0) to possibly end.
   wait $PID 

   if [ -f $FILE ];
   then
      echo "Update successfully"
      mv appcp app
      chmod "+x" app
      /app & # restart
   else
      #error happened if file does not exist 
      #restart
      /app &
   fi
done
    
por zacharoni16 07.10.2015 / 03:39

1 resposta

2

Esse tipo de coisa pode funcionar. Eu adicionei uma "armadilha" a uma função de shell chamada "quitter", que é chamada se e quando o script inicial obtém um SIGINT.

#!/bin/bash

function quitter {
    echo "SIGINT handler, disowning $PID"
    disown $PID
    exit 1;
}

trap quitter SIGINT

FILE=appcp
./app 1000 &
PID=$! #process ID of app

while true
do
   # The app background process uses exit(0) to possibly end.
   wait $PID
   if [[ -f $FILE ]]
   then
      echo "Update successfully"
      mv $FILE app
      chmod "+x" app
      ./app &
   else
      echo plain restart
      ./app &
   fi
   PID=$! #process ID of app
done

Eu não tenho certeza de que fazer disown dentro da função de manipulador de armadilhas é a coisa certa a fazer, mas não consigo entender o que você está tentando fazer. Quando eu executar o script com um programa compilado que apenas dorme por 1000 segundos como o "app". Um controle-C do programa "inicial" deixa o "aplicativo" em execução. Este é o bash 4.3.042-3 em uma máquina Arch Linux x86_64 atualizada, kernel 4.1.9.

O grande problema que posso ver com esse método é que, embora o "aplicativo" ainda esteja em execução, não há como o script "inicializador" começar a monitorá-lo novamente. Você terá que matar o "app" de alguma forma, em seguida, invocar o script "starter" para obter um processo "app" monitorado.

    
por 07.10.2015 / 04:31