web-dev-qa-db-fra.com

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

J'ai des 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

Ceci exécute une application (xterm dans ce cas) et si l'application se bloque, 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 la redémarre.

Y at-il un moyen pour démarrer une application de script bash, regardez si elle est en cours d'exécution, à réexécuter il si le script s'est écrasé ou ne rien faire si l'utilisateur l'a fermé correctement?

18
Dictador

Essaye ça:

while true; do xterm && break; done

Les applications ont codes d'état de sortie de sorte que si quelque chose se passe bien, il renvoie zéro ... Et si quelque chose ne va pas, un autre numéro est jeté. 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 à statut zéro et, le cas échéant, rompt la boucle. S'il se bloque, il jettera autre chose que 0 et la clause && ... ne déclenchera pas; il vous suffira de faire une boucle et d'exécuter xterm.

29
Cyrus

Dans la condition while, vous pouvez tester si l'état de sortie de xterm a réussi ou non avec quelque chose comme ceci:

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

La variable $? conserve le statut de sortie de la dernière commande exécutée.

6

Je vais vous suggérer d'utiliser.

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

Cela relancera votre programme s'il est tué.

0
Aravind Ekan

Essayez d'utiliser superviseur c'est très simple et facile à ajouter un programme ou un script à exécuter . Dans le cas minimal, vous avez besoin de command et peut-être exitcodes dans programx-section pour configurer.

exitcodes est 0,2 par défaut, ce qui signifie:

supervisord relancera le processus s'il se termine avec un code de sortie non défini dans cette liste

En général, vous voulez: relancer si le script plante ou ne rien faire si l'utilisateur l'a fermé correctement (ou si le script s'est 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 Fichier de configuration documentation.