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?

Dictador
fonte

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.

Cyrus
fonte
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.

Leonid V. Fedorenchik
fonte
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.

Aravind Ekan
fonte
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 .

Максим Шатов
fonte