Programmation.shell : détecter la fin d'un programme

Posté par Mildred (Jabber id, page perso, ) le 20 juin 2005
0
Voila, j'ai un petit problème.

Je suis en train de faire un petit script qui se charge de lancer wine avec certains paramètres. le problème c'est que parfois wine fait un processus en arrière plan et le processus principal rend la main.

Du coup, mon script restaure les paramètres comme avant et wine ne s'execute pas là où il faudrait.



Alors, question: comment détecter lorsqu'un programme avec TOUS ses processus enfants se terminent ?

J'ai tenté en récupérant le processus de wine par $!, puis en testant si ps --pid $monpid donnait quelquechose et lorsque le processus se termine, quitter le script.

Mais le script se termine trop tôt.



Comment faire ..?

Merci pour les réponses

> Lire le message (6 commentaires, moyenne: 1,5).  

Vous avez demandé le commentaire #594932.

man bash

Posté par Bruno Muller (Jabber id, page perso, ) le 20/06/2005 à 08:45. (lien). Évalué à 1.

wait [n]
Attend que le processus indique se termine, et renvoie son code
de retour. n peut indiquer un PID, ou un job. S'il s'agit d'un
indicateur de job, on attendra la fin de tous les processus du
tube de ce job. Si n est omis, on attend la fin de tous les
processus fils actuellement actifs, et le code de retour sera
zéro. Si n se rapporte à un processus ou un job inexistant, le
code de retour sera 127. Dans tous les autres cas, le code de
retour sera celui du dernier processus ou job attendu.

[ Répondre ]

  • [^]Re: man bash

    Posté par Lucas (page perso, ) le 20/06/2005 à 09:03. (lien). Évalué à 1.

    Comme le processus "principal" de wine se termine tout de suite (après avoir forké un "processus en arriere-plan"), wait() ne fonctionne pas. Wait() retournera dès que le processus "principal" aura terminé.

    [ Répondre ]

    • [^]Re: man bash

      Posté par Bruno Muller (Jabber id, page perso, ) le 20/06/2005 à 12:22. (lien). Évalué à 0.

      On peut dire à la fonction wait de bash d'attendre la fin d'un processus particulier, désigné par sun PID ou le numéro du job...

      Donc je persiste et je signe :)

      [ Répondre ]

      • [^]Re: man bash

        Posté par gc (page perso, ) le 20/06/2005 à 12:51. (lien). Évalué à 3.

        Ouais mais faudrait lire l'énoncé du problème quand même :)

        Le processus lanceur va finir, ton wait va finir par la même occasion.

        [gc@meuh /tmp] ruby -e 'sleep 10; puts "detaching"; fork or exec %q(ruby -e "puts %q(detached); sleep 10; puts %q(finishing detached process)")' &
        [1] 18578
        [gc@meuh /tmp] wait `ps --ppid $$ | grep ruby | cut -d\ -f1`; echo "wait finished"
        detaching
        wait finished
        [gc@meuh /tmp] detached
        finishing detached process

        Tu vois que lorsque le processus lanceur fait un fork, lance un autre processus, et se termine, le wait est terminé par la même occasion.


        Au passage, ma solution invoquée plus haut (utilisation de ps --ppid) déconne aussi, parce qu'en fait le parent du wine n'est plus le shell mais init (je ne me rappelais plus de ce comportement - lorsque le parent finit c'est init qui reprend la parenté, je pensais que ça passait au grand-parent).

        Hum ma seule solution au problème d'origine, se débrouiller pour savoir quel est le PID du processus arrière-plan. Je ne vois pas d'autre solution là.

        [ Répondre ]

        • [^]Re: man bash

          Posté par Stéphane GENEIX () le 28/06/2005 à 18:35. (lien). Évalué à 1.

          le processus forké est pas censé avoir le même numéro de job que wine ?
          enfin je dis ca, mais g pas regardé la doc de bash..

          [ Répondre ]