Création d'un script Bash qui exécutera un programme et s'il se ferme sans se bloquer, le réexécutera


8

J'aimerais connaître la façon la plus simple de créer un script bash qui exécutera une application dans MacOSX (c'est un système basé sur UNIX, j'ai donc supposé que c'était le bon endroit). attendez la fin du programme. Si la sortie n'était pas un crash, exécutez-la à nouveau. Sinon, laissez la fenêtre de rapport de plantage ouverte et quittez.

J'aimerais que ce script s'exécute pour toujours jusqu'à ce que le crash ou la résiliation manuelle.

J'ai une vague idée mais pas sûre. Voici ce que j'ai jusqu'à présent:

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

vous ne voulez certainement pas qu'un script s'exécute pour toujours pour une raison quelconque. vous voulez qu'un service - ou un démon - s'exécute pour toujours. Je ne sais pas comment ils le font sur Apples, mais vous devriez probablement regarder de plus près votre système init pour savoir s'il existe un moyen d'enregistrer un service avec lui. Habituellement, les démons se réexécutent périodiquement pour mettre à jour / enregistrer l'état - ils ne bouclent pas indéfiniment, vraiment.
mikeserv

Réponses:


12

C'est ce que font les boucles Bash while :

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

Il exécutera l'application et s'il se termine correctement, exécutez le corps de la boucle. :est la commande no-op du shell (la boucle doit avoir un corps, c'est ce que nous y mettons); après cela, il revient en haut et exécute à nouveau le programme. S'il échoue, la boucle s'arrête et le script se ferme.

Cependant, il semble que ce que vous exécutez soit une application Mac ordinaire ( .app): il y a quelques problèmes qui se posent dans ce cas. La première est que vous devez utiliser la opencommande , plutôt que d' exécuter le répertoire d'applications directement: open /path/to/application.app.

L'autre est que lorsque vous le faites, opencela se terminera généralement immédiatement avec succès, indépendamment de ce que l'application continue à faire: ce n'est pas absolument universel, mais la plupart le seront. Si votre un fait, vous pouvez utiliser l' -Woption pour forcer openà bloquer jusqu'à la fin de l' application: open -W /path/to/application.app. Notez que si l'application était déjà en cours d'exécution, cela attendra également la fin de l'exécution existante.

L'ampleur d'un problème dépend de l'application que vous exécutez. Si cela ne fonctionne pas correctement, cela peut ne pas être la meilleure option. Dans ce cas, vous feriez probablement mieux d'utiliser AppleScript, que vous pouvez poser sur Ask Different .


J'ai une application sur Mac qui peut intentionnellement planter avec laquelle j'ai testé votre solution ci-dessus. il redémarrera automatiquement l'application même après un crash. Existe-t-il un moyen de vérifier la sortie de l'application? as open se terminera évidemment par une sortie de 0 et sera de nouveau exécuté de toute façon.
Ben Crazed Up Euden

@BenCrazedUpEuden: Ma compréhension est que openne renvoie l'échec que pour certaines erreurs de démarrage. Les applications sont démarrées par un service système, pas directement, il n'y a donc pas de canal de communication direct en arrière. Parfois , il est possible de démarrer l'application exécutable directement: /Applications/YourProgram.app/Contents/MacOS/YourProgram. Sinon, nous dérivons hors d'Unix et vers des endroits où vous obtiendrez une meilleure réponse sur Ask Different . Vous pouvez exécuter AppleScript à partir du shell avecosascript
Michael Homer

0

J'ai testé ceci:

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

Cela fonctionne en testant le code retour de votre commande, style POSIX. 0 signifie Ok, tout le reste peut être traité comme une erreur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.