[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