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

Posté par  (site web personnel) .
Étiquettes : aucune
0
20
juin
2005
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
  • # meuh

    Posté par  (site web personnel) . Évalué à 3.

    ps --ppid $$
  • # man bash

    Posté par  . É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.
    • [^] # Re: man bash

      Posté par  . É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é.
      • [^] # Re: man bash

        Posté par  . É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 :)
        • [^] # Re: man bash

          Posté par  (site web personnel) . É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à.
          • [^] # Re: man bash

            Posté par  . É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..

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.