[Linux] Question shell script : Mais pourquoi il exit comme ca ?
Antoine Delaporte
adlp@::1
Mer 20 Nov 14:15:22 CET 2024
Sur le mercredi 20 novembre 2024 à 12:38, Marc Chantreux a écrit:
>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.
Pas con, sauf que ce que, que ce, je ne dis pas, c'est que lorsque je
lance la même commande, mon shell reste vivant... donc... oui cette
hypothèse me plait bien... mais nan...
>> 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 !
Comprend pas !
(oui, on me demande de prouver que je ne comprends pas, donc... bin.. je
ne comprends pas)
>> 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
Oui clairement, j'aurais dû faire ça
>* 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
Je vais tester cela.
>> 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.
Euh... bin... j'ai résumé précédemment mon script... et non, ca ne
plante pas avant.
======
Je reviendrai rapidement dans un autre mail avec un nouveau jeu de tests
de ce truc-là.
Je ne comprend meme pas pourquoi je n'ai pas lancé avec set -e ...
>> 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.
Mais il ne devait pas mourir.... c'est a cause d'une execution sommaire
d'une commande qu'il est mort... meme pas pour la gloire !
>> 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.
Oui, carrement.
J'ai honte... (vraiment)
'Toine
--
Plus d'informations sur la liste de diffusion linux