OVH Cloud OVH Cloud

Code retour d'un processus en arrière-plan

4 réponses
Avatar
Fred S
Bonjour,

je souhaiterais récupérer le code retour d'un script
lancé en arrière plan. Existe-t-il un moyen de faire ça sans
passer par un fichier ? (Je suis en ksh)

Exemple:

traitement_A.ksh &
traitement_B.ksh &
wait

# Si A ou B a planté, afficher un message d'erreur...
# Comment coder ça ?


Merci d'avance pour vos réponses.

4 réponses

Avatar
Laurent Wacrenier
Fred S écrit:
je souhaiterais récupérer le code retour d'un script
lancé en arrière plan. Existe-t-il un moyen de faire ça sans
passer par un fichier ? (Je suis en ksh)

Exemple:

traitement_A.ksh &
traitement_B.ksh &
wait

# Si A ou B a planté, afficher un message d'erreur...
# Comment coder ça ?


(traitement_A.ksh || echo echec A >&2 ) &
(traitement_B.ksh || echo echec B >&2 ) &
wait

Avatar
David LE BOURGEOIS
Bonjour,


Bonsoir.

je souhaiterais récupérer le code retour d'un script
lancé en arrière plan. Existe-t-il un moyen de faire ça sans
passer par un fichier ? (Je suis en ksh)

Exemple:

traitement_A.ksh &
traitement_B.ksh &
wait


On peut utiliser ça :

commande & PID=$!
wait $PID

# Si A ou B a planté, afficher un message d'erreur...
# Comment coder ça ?



Ça donne par exemple :

$ cat foo
{ sleep 1 ; true ; } & i=$!
{ sleep 2 ; false ; } & j=$!
{ sleep 3 ; exit 3 ; } & k=$!
wait $i && printf "i => OKn" || printf "i => KO [$?]n"
wait $j && printf "j => OKn" || printf "j => KO [$?]n"
wait $k && printf "k => OKn" || printf "k => KO [$?]n"

$ ./foo
i => OK
j => KO [1]
k => KO [3]


Merci d'avance pour vos réponses.



De rien.


--
David LE BOURGEOIS

Avatar
cedric
David LE BOURGEOIS wrote:
{ sleep 1 ; true ; } & i=$!
{ sleep 2 ; false ; } & j=$!
{ sleep 3 ; exit 3 ; } & k=$!
wait $i && printf "i => OKn" || printf "i => KO [$?]n"
wait $j && printf "j => OKn" || printf "j => KO [$?]n"
wait $k && printf "k => OKn" || printf "k => KO [$?]n"


Question subsidiaire : si l'un des process (ici les sleep) se termine
AVANT son wait, le process va rester dans la liste des process pour que
le wait puisse quand même récuperer son code de sortie.

En mode interactif (sur la ligne de commande), ceci ne marche pas : wait
se pleindra simplement de ce que le process attendu n'existe pas.

Question : A quelle niveau se fait la différence ? Et qui décide que les
process terminés doivent attendre (zombis) dans un cas, être détruits
dans l'autre ?

Avatar
David LE BOURGEOIS
David LE BOURGEOIS wrote:

{ sleep 1 ; true ; } & i=$!
{ sleep 2 ; false ; } & j=$!
{ sleep 3 ; exit 3 ; } & k=$!
wait $i && printf "i => OKn" || printf "i => KO [$?]n"
wait $j && printf "j => OKn" || printf "j => KO [$?]n"
wait $k && printf "k => OKn" || printf "k => KO [$?]n"



Question subsidiaire : si l'un des process (ici les sleep) se termine
AVANT son wait, le process va rester dans la liste des process pour que
le wait puisse quand même récuperer son code de sortie.

En mode interactif (sur la ligne de commande), ceci ne marche pas : wait
se pleindra simplement de ce que le process attendu n'existe pas.


$ { sleep 1 ; exit 3 ; } & PID=$!
[1] 30140
$
[1] + exit 3 {; sleep 1; exit 3; }
$ wait $PID
wait: pid 30140 is not a child of this shell
$ echo $?
3

--
David LE BOURGEOIS