Nous exécutons le script script1
depuis le script script_main
script_main
:
#!/bin/bash
/tmp/script1
echo $?
sleep 2
echo script ended
script1
:
#!/bin/bash
exit 1
Comme il est évident, script1
sort avec le code de sortie 1
mais le script principal continuera jusqu'à la fin.
Ma question :est-ce possible lorsque script1
est-ce que exit 1
, puis aussi le main_script
sera arrêté immédiatement ?
Réponse acceptée :
Le moyen le plus simple serait d'avoir explicitement le premier script exit
si l'autre script a échoué. Mettez l'exécution du script dans une condition, comme
otherscript.sh || exit 1
ou
if ! otherscript.sh ; then
ret=$?
echo "otherscript failed with exit code $ret. exit." >&2
exit 1
fi
Cela permettrait au script principal d'effectuer le nettoyage qu'il souhaite, ou simplement d'essayer une autre solution, éventuellement en fonction du code de sortie de l'enfant. Dans le premier, nous pourrions utiliser uniquement || exit
, pour transmettre le code de sortie de l'enfant.
Si vous voulez que le script principal se ferme quand tout la commande qu'il démarre échoue, alors set -e
.
set -e
otherscript.sh
echo "this will not run if otherscript fails"
set -e
ne s'applique pas aux programmes qui s'exécutent à l'intérieur de constructions conditionnelles, nous pouvons donc toujours tester des codes particuliers ou les suivre avec || true
pour ignorer l'échec. Mais avec des points de sortie partout maintenant, nous pourrions utiliser trap somecmd EXIT
pour effectuer un nettoyage avant la fermeture du shell, quel que soit l'endroit où il se produit.
Il est également possible que le script interne force le script principal à se fermer, mais un peu hostile, vous ne vous attendriez pas à ce qu'une application habituelle le fasse. Mais, si vous le souhaitez, le simple fait que le script interne tire sur son processus parent est un moyen :
$ cat mainscript.sh
#!/bin/bash
./otherscript.sh
echo "$0 exiting normally"
$ cat otherscript.sh
#!/bin/bash
echo "$0 kill $PPID"
kill $PPID
$ bash mainscript.sh
./otherscript.sh kill 11825
Terminated
Ici, si vous exécutez otherscript.sh
depuis un shell interactif, il tentera de filmer la session interactive. Tous les shells que j'ai testés semblent ignorer le SIGTERM
dans ce cas lors de l'exécution interactive, cependant. Dans tous les cas, le shell principal pourrait à nouveau trap
le SIGTERM
.
Au lieu de tirer uniquement sur le processus parent, vous pouvez utiliser kill 0
pour tuer tous les processus du groupe de processus otherscript.sh
s'exécute. S'il est démarré à partir d'un shell non interactif, cela inclura généralement le parent.