Criando um script Bash que executará um programa e, se sair sem travar, o executará novamente

8

Gostaria de saber a maneira mais fácil de criar um script bash que executará um aplicativo no MacOSX (é um sistema baseado em UNIX, por isso presumi que este fosse 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.

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
Ben enlouqueceu Euden
fonte
você quase definitivamente não quer que um script seja executado para sempre por qualquer motivo. você deseja que um serviço - ou um daemon - seja executado para sempre. Não sei como eles fazem isso no Apples, mas você provavelmente deve olhar um pouco mais de perto no seu sistema init para descobrir se há alguma maneira de registrar um serviço nele. Geralmente, os daemons se reexistem periodicamente para atualizar / salvar o estado - eles não fazem loop para sempre, na verdade.
mikeserv

Respostas:

12

Isto é o que o Bash while loops faz:

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

Ele executará o aplicativo e, se terminar com êxito, execute o corpo do loop. :é o comando no-op do shell (o loop precisa ter um corpo, então é isso que colocamos lá); depois disso, ele volta ao topo e executa o programa novamente. Se falhar, o loop para de executar e o script é encerrado.

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

A outra é que, quando você faz open, normalmente termina imediatamente com sucesso, independentemente do que o aplicativo continua a fazer: isso não é absolutamente universal, mas a maioria será. Se o seu se faz, você pode usar a -Wopção para forçar opena bloquear até que as pontas de aplicação: open -W /path/to/application.app. Observe que, se o aplicativo já estiver em execução, isso esperará até que a execução existente termine também.

A quantidade de um problema depende de qual aplicativo você está executando. Se não funcionar bem, fazer isso a partir do shell pode não ser a melhor opção. Nesse caso, é provável que você esteja melhor com o AppleScript, sobre o qual você pode perguntar sobre o Ask Different .

Michael Homer
fonte
Eu tenho um aplicativo no mac que pode falhar intencionalmente com o qual eu testei sua solução acima. ele reiniciará o aplicativo automaticamente mesmo depois de travar. Existe uma maneira de verificar a saída do aplicativo? como aberto, obviamente, terminará com uma saída de 0, e será executado novamente independentemente.
Ben Crazed Up Euden
@BenCrazedUpEuden: Meu entendimento é que openapenas retorna falhas para determinados erros de inicialização. Os aplicativos são iniciados por um serviço do sistema, não diretamente, portanto, não há canal de comunicação direta de volta. Às vezes, é possível iniciar o executável do aplicativo diretamente: /Applications/YourProgram.app/Contents/MacOS/YourProgram. Caso contrário, estamos saindo do Unix para lugares onde você terá uma resposta melhor em Ask Different . Você pode executar o AppleScript a partir do shell comosascript
Michael Homer
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.

fduff
fonte