OVH Cloud OVH Cloud

Attendre son enfant

7 réponses
Avatar
Ph. Ivaldi
Bonjour,

Existe-t-il un moyen pour forcer un processus père à ne se terminer que
lorsqu'un hypothétique processus enfant est terminé ?
J'ai tenté:
* `commande` mais ça pose des problèmes en cas de sortie sur
stdout.
* echo `commande` mais du coup je perds le code erreur de retour (et
j'en ai besoin).
* `commande 1>&2` qui ne marche pas mieux.

Note: ces commandes sont lancées depuis (X)Emacs (dans un environnement
Bash) qui s'obstine à tuer les enfants dès que le père se termine.
--
Merci de votre attention,
Philippe Ivaldi.
http://piprim.tuxfamily.org/

7 réponses

Avatar
Stephane Chazelas
2007-02-08, 18:21(+01), Ph Ivaldi:
Bonjour,

Existe-t-il un moyen pour forcer un processus père à ne se terminer que
lorsqu'un hypothétique processus enfant est terminé ?
J'ai tenté:
* `commande` mais ça pose des problèmes en cas de sortie sur
stdout.
* echo `commande` mais du coup je perds le code erreur de retour (et
j'en ai besoin).
* `commande 1>&2` qui ne marche pas mieux.

Note: ces commandes sont lancées depuis (X)Emacs (dans un environnement
Bash) qui s'obstine à tuer les enfants dès que le père se termine.


{ empty=`command 3>&1 >&4 4>&-`; } 4>&1


--
Stéphane

Avatar
David LE BOURGEOIS
Bonjour,


Bonsoir.

Existe-t-il un moyen pour forcer un processus père à ne se terminer que
lorsqu'un hypothétique processus enfant est terminé ?


$ cat pere
./fils & PID=$!
printf "waiting (pid %d) ... " "$PID"
wait "$PID"
printf "done ($?)n"

$ cat fils
sleep 3
exit 42

$ ./pere
waiting (pid 6215) ... done (42)

--
David LE BOURGEOIS
e-mail : david.lebourgeois (at) free.fr
jabber : david.lebourgeois (at) jabber.fr

Avatar
Stephane Chazelas
2007-02-08, 17:55(+00), David LE BOURGEOIS:
Bonjour,


Bonsoir.

Existe-t-il un moyen pour forcer un processus père à ne se terminer que
lorsqu'un hypothétique processus enfant est terminé ?


$ cat pere
./fils & PID=$!
printf "waiting (pid %d) ... " "$PID"
wait "$PID"
printf "done ($?)n"

$ cat fils
sleep 3
exit 42

$ ./pere
waiting (pid 6215) ... done (42)


Oui mais:

$ cat enfant
sleep 10 & exit 12
$ cat pere
./enfant
$ ./pere
$ ps
...sleep...

Je crois que c'est ce que l'OP voulait dire, d'ou l'utilisation
d'un pipe pour attendre tous les "writers".

$ cat pere-correcte
{ blah=`./enfant 3>&1 >&4 4>&-`; } 4>&1
echo "exit status de enfant: $?"
$ time ./pere
exit status de enfant: 12
...10 seconds...

--
Stéphane


Avatar
talon
Ph. Ivaldi wrote:
Bonjour,

Existe-t-il un moyen pour forcer un processus père à ne se terminer que
lorsqu'un hypothétique processus enfant est terminé ?
J'ai tenté:
* `commande` mais ça pose des problèmes en cas de sortie sur
stdout.
* echo `commande` mais du coup je perds le code erreur de retour (et
j'en ai besoin).
* `commande 1>&2` qui ne marche pas mieux.


`commande > /dev/null 2>&1 || cas d'erreur`
Si la commande renvoie une erreur, ce qui est aprés le || est exécuté.
Donc ça remplit toutes les conditions que tu veux.


--

Michel TALON

Avatar
Stephane Chazelas
2007-02-8, 18:47(+00), Michel Talon:
Ph. Ivaldi wrote:
Bonjour,

Existe-t-il un moyen pour forcer un processus père à ne se terminer que
lorsqu'un hypothétique processus enfant est terminé ?
J'ai tenté:
* `commande` mais ça pose des problèmes en cas de sortie sur
stdout.
* echo `commande` mais du coup je perds le code erreur de retour (et
j'en ai besoin).
* `commande 1>&2` qui ne marche pas mieux.


`commande > /dev/null 2>&1 || cas d'erreur`
Si la commande renvoie une erreur, ce qui est aprés le || est exécuté.
Donc ça remplit toutes les conditions que tu veux.
[...]


Non, en redirigeant le stdout de commande vers /dev/null, tu
perds la connection au pipe. Donc, `...` perd son effet
d'attendre tous les eventuels fils de "commande" qui ont un fd
ouvert en ecriture sur le pipe.

`sh -c 'sleep 10 &'`

se termine apres 10 seconds.

`sh -c 'sleep 10 &' > /dev/null`

se termine instantanement.

--
Stéphane


Avatar
talon
Stephane Chazelas wrote:
se termine apres 10 seconds.

`sh -c 'sleep 10 &' > /dev/null`

se termine instantanement.



Et oui, tu as raison, comme toujours. N'empêche que ceci
traîne bien 5s avant de retourner:
`sleep 5 > /dev/null`
et ça pareil
sh -c 'sleep 5 > /dev/null'


--

Michel TALON

Avatar
Ph. Ivaldi
Le 08 février 2007 à 18h44:15,
Stephane Chazelas écrivit :

{ empty=`command 3>&1 >&4 4>&-`; } 4>&1


Exactement ce que je cherche.
Merci!
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/