[Linux] Question shell script : Mais pourquoi il exit comme ca ?
Marc Chantreux
mc@::1
Mer 20 Nov 12:38:18 CET 2024
hello Toine,
On Wed, Nov 20, 2024 at 11:11:07AM +0100, Antoine Delaporte wrote:
> Lorsque je fais des shell script, je comprends qu'il se finisse selon 3
> conditions :
> * Fin du script
> * exit XX
> * set -e, avec un biniou qui fini avec un exit code différent de 0
* il a exec et a complètement changé de vie, d'identité, de trajectoire.
et franchement: j'aimerais pas être dans la peau d'un bash.
> Sauf que… j'ai des scripts qui se suicident avant la fin, en ne respectant
> _aucune_ de ces conditions, et j'aimerais comprendre la magie du biniou.
prouve le !
> Voici donc un exemple réel (oui excessivement simplifié)
>
> #!/bin/bash
> echo Premiere passe
> docker exec nginx nginx -s reload
> echo Seconde passe
> docker exec nginx-mua nginx -s reload
> echo Fin
>
>
> Donc lorsque j'exécute ce script via une crontab, j'obtiens (dans le mail
> associé) Uniquement un "Premiere passe". Et je confirme la non-exécution du
> second reload...
on peut donc sortir des 2 premières hypothèses par simple lecture.
* la 3ème hypothèse peut se verifier avec un set +e
* la 4ème hypothèse n'est possible que si docker est une fonction
(t'as peut-être un truc qui traine dans ton .bashrc?)
j'aurais tendance à écrire un script qui
* protège de ces cas spécifiques
en restant robuste (on garde les bonnes pratiques -ue mais on ajoute des ||)
* évite de faire du echo puisque l'idée c'est plutôt de savoir ce qui a été executé (-x)
* utilise dash pour éviter tout effet de bord du à .bashrc
* appeller explicitement le binaire pour être absolument certain que fork a lieu avant exec
#!/bin/sh -eux
reload() {
/sbin/docker exec "$@" -s reload ||
>&2 echo it failed
}
reload nginx nginx
reload nginx-mua nginx
> Pour moi, la commende docker ne devrait pas pouvoir faire quitter le script
sauf si c'est une fonction qui plante avant d'appeller le binaire ou qui
fait un exec docker.
> Bref... est-ce que j'ai la berlue ou il y a une forme de logique ?
je ne condamne pas un bash qui veut mourrir. RIP petit processus parti trop tôt.
> PPS: pour ceux qui ont une impression de deja vu, oui ce mail a ete envoyé sur
> la mauvaise liste, par mes soins :-/ désolé encore.
et merci à Alexandre pour ce rappel de bonnes pratiques.
a+
--
Marc Chantreux
Pôle CESAR (Calcul et services avancés à la recherche)
Université de Strasbourg
14 rue René Descartes,
BP 80010, 67084 STRASBOURG CEDEX
03.68.85.60.79
Plus d'informations sur la liste de diffusion linux