Criando um script Bash que executará um programa e, se ele sair sem travar, será executado novamente

8

Eu gostaria de saber a maneira mais fácil de criar um script bash que irá rodar um aplicativo no MacOSX (é um sistema baseado em UNIX, então eu assumi que este era o lugar certo). aguarde o programa sair. Se a saída não foi um acidente, execute-o novamente. Caso contrário, deixe a janela do relatório de falha aberta e saia.

Eu gostaria que esse script fosse executado para sempre até a falha ou o encerramento manual.

Eu tenho uma ideia vaga, mas não tenho certeza. Aqui está o que eu tenho até agora:

echo "Launching Autorun…"

if ["$1" -eq "0"]; then
# Application exited successfully. Restarting.
/path/to/application.app
else
# An error occured. Do nothing and exit.
    exit
fi
    
por Ben Crazed Up Euden 24.07.2014 / 12:21

2 respostas

12

Isso é o que loop while do Bash:

while /path/to/application.app
do
    :
done

Ele executará o aplicativo e, se ele terminar com êxito, executará o corpo do loop. : é o comando não-operacional do shell (o ciclo tem que ter um corpo , então é isso que colocamos lá); depois disso, volta ao topo e executa o programa novamente. Se falhar, o loop pára de ser executado e o script sai.

No entanto, parece que o que você está executando pode ser um aplicativo Mac comum ( .app ): há alguns problemas que surgem nesse caso. Uma é que você precisa usar o open command , em vez de executar o diretório do aplicativo diretamente: open /path/to/application.app .

O outro é que quando você executa open normalmente termina imediatamente com sucesso, independentemente do que o aplicativo faça: isso não é absolutamente universal, mas a maioria o fará. Se o seu, você pode usar a opção -W para forçar o open a bloquear até que o aplicativo termine: open -W /path/to/application.app . Observe que, se o aplicativo já estiver em execução, ele aguardará até que a execução existente também termine.

Quanto de um problema disso depende do tipo de aplicativo que você está executando. Se não funcionar bem, fazer isso a partir do shell pode não ser a melhor opção. Nesse caso, você provavelmente está melhor com o AppleScript, sobre o qual você pode perguntar sobre Pergunte diferente .

    
por 24.07.2014 / 12:36
0

Eu testei isso:

#!/bin/bash
while <your_cmd_here>
do
    true
done

Isso funciona testando o código de retorno do seu comando, estilo POSIX. 0 significa Ok, qualquer outra coisa pode ser tratada como um erro.

    
por 24.07.2014 / 12:35