Executar novamente um script de aplicativo quando ele falhar?


18

Eu tenho alguns aplicativos que precisam ser executados no meu laptop o tempo todo.

Eu uso um script bash para iniciar esses aplicativos. No meu script, eu tenho um loop que se parece com isso:

while true;
do
    xterm
done

Isso executa um aplicativo ( xtermnesse caso) e, se o aplicativo travar, o loop o inicia novamente.

Isso tem uma desvantagem de que não há saída "limpa" desse loop. Portanto, mesmo que a intenção do usuário seja fechar xterm, o loop inicia novamente.

Existe uma maneira de iniciar um aplicativo a partir do script bash, verificar se está em execução, executá- lo novamente se o script falhar ou não fazer nada se o usuário o fechar corretamente?

Respostas:


30

Tente o seguinte:

while true; do xterm && break; done

Os aplicativos têm códigos de status de saída para que, se algo sair bem, retorne zero ... E se algo der errado, ele lança outro número. Isso permite que as pessoas se conectem e descubram o problema exato. É isso que a outra resposta está fazendo.

&&apenas verifica se o comando anterior foi uma saída com status zero e, se foi, interrompe o loop. Se travar, lançará algo diferente de 0 e a && ...cláusula não será acionada; ele simplesmente volta e volta xterm.


6
Isso é bem elegante.
Oli

Hmm .. O contrário também:while xterm; do true; done
muru

11
@muru: Isso funciona para mim:while ! xterm; do :; done
Cyrus

11
@ Cyrus Ah, sim. esqueceu o !.
muru

Eu criei um monstro. Como eu mato?
Tony Ruth

6

Na whilecondição, você pode testar se o status de saída xtermfoi bem-sucedido ou não com algo parecido com isto:

result=1
while [ $result -ne 0 ]; do
    xterm
    result=$?
done

$? A variável mantém o status de saída do último comando executado.


0

Eu vou sugerir que você use.

até xterm; echo "programa terminou com o status $?" ; feito

Isso irá executar novamente o seu programa se ele for morto.


0

Tente usar supervisor , muito simples e fácil de adicionar programa ou script para executar . No seu caso, o mínimo que você precisa commande talvez exitcodesna seção programx para configurar.

O padrão exitcodesé 0,2, então significa:

A supervisord reiniciará o processo se ele sair com um código de saída que não esteja definido nesta lista

Em geral, é o que você deseja: execute novamente se o script falhar ou não faça nada se o usuário o fechou corretamente (ou o script foi concluído com êxito)

tente a configuração mais simples primeiro:

[program:you_app_name]
command=/path/to/you/app

Para obter mais flexibilidade, consulte a documentação do arquivo de configuração .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.