|
|
|
|
||||||
| fr.comp.os.unix Système UNIX. |
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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/ |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Le 08/02/2007 à 17:21:46, Ph Ivaldi a écrit :
> 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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
2007-02-08, 17:55(+00), David LE BOURGEOIS:
> Le 08/02/2007 à 17:21:46, Ph Ivaldi a écrit : >> 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 |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
Ph. Ivaldi <piv_pasde@pub_tele2.fr> 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 |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
2007-02-8, 18:47(+00), Michel Talon:
> Ph. Ivaldi <piv_pasde@pub_tele2.fr> 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 |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
Stephane Chazelas <cette.adresse@est.invalid> 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 |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
Le 08 février 2007 à 18h44:15,
Stephane Chazelas <cette.adresse@est.invalid> écrivit : > { empty=`command 3>&1 >&4 4>&-`; } 4>&1 Exactement ce que je cherche. Merci! -- Philippe Ivaldi. http://piprim.tuxfamily.org/ |
|
![]() |
| Outils de la discussion | |
|
|