Réexécuter un script d'application lorsqu'il se bloque?

18

J'ai certaines applications qui doivent fonctionner sur mon ordinateur portable tout le temps.

J'utilise un script bash pour démarrer ces applications. Dans mon script, j'ai une boucle qui ressemble à ceci:

while true;
do
    xterm
done

Cela exécute une application ( xtermdans ce cas) et si l'application plante, la boucle la redémarre.

Cela a pour inconvénient qu'il n'y a pas de sortie "propre" de cette boucle. Ainsi, même si l'intention de l'utilisateur est de fermer xterm, la boucle recommence.

Existe-t-il un moyen de démarrer une application à partir du script bash, de vérifier si elle est en cours d'exécution, de la réexécuter si le script s'est écrasé ou de ne rien faire si l'utilisateur l'a fermée correctement?

Dictador
la source

Réponses:

30

Essaye ça:

while true; do xterm && break; done

Les applications ont des codes d'état de sortie de sorte que si quelque chose se termine bien, il retourne zéro ... Et si quelque chose s'est mal passé, il jette un autre numéro. Cela permet aux gens de se connecter et de découvrir le problème exact. C'est ce que fait l'autre réponse.

&&vérifie simplement que la commande précédente était une sortie de statut zéro et si elle l'était, rompt la boucle. S'il plante, il && ...lancera autre chose que 0 et la clause ne se déclenchera pas; il va simplement revenir en arrière et courir xterm.

Cyrus
la source
6
C'est assez élégant.
Oli
Hmm .. L'inverse aussi:while xterm; do true; done
muru
1
@muru: Cela fonctionne pour moi:while ! xterm; do :; done
Cyrus
1
@Cyrus Ah, oui. oublié le !.
muru
J'ai créé un monstre. Comment puis-je le tuer?
Tony Ruth
6

Dans la whilecondition, vous pouvez tester si l'état de sortie de xterma réussi ou non avec quelque chose comme ceci:

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

$? La variable contient l'état de sortie de la dernière commande exécutée.

Leonid V. Fedorenchik
la source
0

Je vais vous suggérer d'utiliser.

jusqu'à xterm; echo "le programme s'est terminé avec le statut $?" ; terminé

Cela réexécutera votre programme s'il est tué.

Aravind Ekan
la source
0

Essayez d'utiliser le superviseur, il est très simple et facile d' ajouter un programme ou un script à exécuter . Dans votre cas, vous avez besoin d'un minimum commandet peut-être exitcodesdans la section programx pour configurer.

La valeur par défaut exitcodesest 0,2, ce qui signifie:

supervisord redémarrera le processus s'il se termine avec un code de sortie qui n'est pas défini dans cette liste

En général, c'est ce que vous voulez: relancez- le si le script s'est écrasé ou ne faites rien si l'utilisateur l'a fermé correctement (ou script terminé avec succès)

essayez d'abord la configuration la plus simple:

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

Pour plus de flexibilité, voir la documentation du fichier de configuration .

Максим Шатов
la source