j'ouvre deux terminaux A & B:
Depuis A :
> sleep 60 &
[1] 11808
> wait 11808 # génial, j'attends
Depuis B :
> wait 11808
bash: wait: pid 11808 is not a child of this shell
caramba!!!
je ne voudrais pas être obligé à scruter en permanence l'état du processus dont j'attends qu'il se termine.
Merci pour vos réponses.
# Worksforme
Posté par fcartegnie . Évalué à -4.
sleep 60& wait $!
[1] 8050
[1]+ Done sleep 60
# Re
Posté par riba . Évalué à 1.
C'est quoi la question? (exactement)
( a priori j'entrevois une solution avec des locks exclusif mais je sais pas ce que tu veux faire... )
[^] # Re: Re
Posté par minitchoup . Évalué à 2.
dans un shell je lance 'xclock'. dans un autre shell (mais pas sous-shell du premier) je veux faire un wait $(PID_XCLOCK). marche pas! comment faire?
[^] # Re: Re
Posté par riba . Évalué à 4.
wait est un builtin shell qui dit au shell de lancer le syscall wait (ou waitpid), donc tu ne peux attendre que les fils du shell.
Il y a plein de solutions a ton probleme:
- ton process tient un lock exculsif sur un fichier (via fcntl), et tu peux donc attendre avec la demande du meme lock;
- ton process tient une socket, et tu peux donc attendre avec un select, ca revient un peu au meme;
- tu t'attaches carrement au processus cible, via ce que tu veux (gdb, ..., le plus simple: strace). L'attache tombera avec la fin du process cible:
shell A
#sleep 60
shell B
#strace -q -e '' -s 0 -p `pidof sleep` && echo 'finit!'
# Use Sed
Posté par Rémi Birot-Delrue . Évalué à 4.
# fichier lock ?
Posté par NeoX . Évalué à 3.
dans le shell B tu regardes s'il y a ce fichier lock
s'il y est alors le process A est en train de tourner, il faut attendre.
s'il n'y est pas, tu peux t'executer.
evidemment cela peut fonctionner dans l'autre sens
mettre le fichier lock à la fin de A, pour que B accepte de se lancer uniquement si le fichier de lock existe
[^] # Re: fichier lock ?
Posté par totof2000 . Évalué à 3.
Pour pallier : indique le No de process dans le fichier et lorsque le process B se lance, il vérifie que le process A tourne toujours.
[^] # Re: fichier lock ?
Posté par NeoX . Évalué à 2.
je n'avais pas pensé au vautrage de A.
mais du coup ce n'est plus /var/lock/mon_verrouA
mais plutot /var/run/mon_appliA
avec le pid dedans
[^] # Re: fichier lock ?
Posté par Dabowl_92 . Évalué à 1.
Exemple pour un script :
trap 'rm verrou' 2
On supprime le verrou si on reçoit le signal 2 (SIGINT), à noter qu'on peut le faire sur d'autres signaux, sauf bien sûr SIGKILL, mais bon on utilise rarement le SIGKILL quand même :)
[^] # Re: fichier lock ?
Posté par Octabrain . Évalué à 1.
[^] # Re: fichier lock ?
Posté par Dabowl_92 . Évalué à 1.
# while
Posté par Octabrain . Évalué à 2.
while kill -0 $LEPID; do sleep 1; done
# la scrutation c'est pas top
Posté par minitchoup . Évalué à 2.
les problèmes de la scrutation périodique :
1/ si la vérification a lieu toutes les secondes, il peut dans le pire cas se passer une seconde entre la terminaison du processus et le moment où elle est détectée
2/ le process de surveillance consomme du CPU inutilement (d'autant plus que la période de scrutation est courte)
Pour cela je trouve la solution suggérée par 'rb14' plus intéressante (le coup du strace). J'attends une solution qui mette en oeuvre une spécificité du noyau (sorte de wait). peut être que je jetterai un œil sur le code du strace.
[^] # Re: la scrutation c'est pas top
Posté par gaaaaaAab . Évalué à 2.
accessoirement, je ne suis pas du tout persuadé qu'attacher un strace à ton process sera moins couteux qu'une surveillance régulière :D
Autre solution, faire lancer ton process par un démon (qui connaitra donc le statut du fils en permanence), et prévoir un protocol de com avec ce démon pour que d'autres process puissent l'interroger sur l'état du fils en passant par des IPCs.
Par contre, en terme de dèv, c'est plus couteux que les autres solutions proposées ... (il faut p-e utiliser autre chose que du shell ?)
Evidemment, le postulat de départ est que le code de ce que tu veux lancer (le fils de ton premier shell) n'est pas sous ton contrôle, sinon, il "suffit" de multithreader le fils et de permettre à d'autres processus de s'enregistrer auprès de lui pour être notifié de la terminaison via des IPCs.
[^] # Re: la scrutation c'est pas top
Posté par gaaaaaAab . Évalué à 1.
1/ les autres propositions de rb14 ne sont pas crades
2/ la solution que je propose est juste une vague ébauche pour signaler qu'il serait possible de mettre en place un méchanisme qui permettrait d'être notifié de la terminaison du processus fils d'un autre processus. Dans la pratique, ça vaut pas le coup. N'importe quelle solutions en shell, quitte à faire un peu de polling, sera sûrement plus adaptée !
[^] # Re: la scrutation c'est pas top
Posté par riba . Évalué à 2.
ah quand même...
Même strace -e '' n'est pas si intrusif que ça en fait, vu qu'il ne fait pratiquement rien (s'attacher uniquement à exit(), mais faut vérifier).
C'est la solution qui ne suppose rien sur le process, et sans polling (car ç'est mal), ni rebond via fichier ou socket.
C'est vrai que son probleme est quand même bizarre, tout contrôler d'en haut et faire un waitpid() est beaucoup plus logique.
[^] # Re: la scrutation c'est pas top
Posté par gaaaaaAab . Évalué à 1.
Dans cas là, strace n'est pas utilisé pour tracer les appels systèmes, mais pour profiter d'un effet de bord : la détection de la fin du process. C'est typiquement du hack ;-)
Mais le fait de viser l'effet de bord, ça rend la solution trompeuse pour des lecteurs non avertis, et du coup, ça réduit la maintenabilité de la solution.
ça va bien pour un script fait chez soi, mais si c'est dans un contexte pro, il faut documenter ça, tout en sachant que de toute façon, personne lit la doc :D
C'est dans ce sens là que je trouve ça un peu crade.
bon, après, y a aussi des problèmes de portabilité sur d'autre *nix mais comme on est sur *linux*fr, on en parle pas (un troll se cache peut-être dans cette phrase ;-)
Après, c'est vrai que strace avec l'option -e'' (je vais pas faire mon malin, je la connaissais pas :), c'est probablement moins gourmand que le classique strace sans option qui te raconte la vie du noyau de la première lib dynamique pas trouvée 150 fois pendant le chargement du process aux 3 misérables appels systèmes dont ton code est "vraiment" responsable =)
Faudrait bencher de toute façon (comme pour toute les questions de perf)
sinon, le polling, c'est mal, mais ça peut être un compromis acceptable (comme d'utiliser strace ;-) là, y a que minitchoup qui sait vraiment ce qu'il veut faire ...
[^] # Re: la scrutation c'est pas top
Posté par riba . Évalué à 1.
vu le ton du journal ("la salope","caramba!!!",..) ça ressemble pas trop à un developpement pro.
C'est vrai que sortir strace juste pour voir le exit() est un peu bourrin, je l'avoue...
> sinon, le polling, c'est mal, mais ça peut être un compromis acceptable
Jusqu'au jour où tu tombes sur le cas : ton process cible meurt et un nouveau chope le même pid juste derrière...
Mon experience: le polling n'est jamais fiable à 100%, il y aura toujours un cas tordu que tu n'auras pas prévu.
[^] # Re: la scrutation c'est pas top
Posté par minitchoup . Évalué à 1.
Il est possible, je n'ai pas fait mais j'en suis aussi convaincu, d'écrire (même en bash) un programme de démarrage et de surveillance qui :
- à son lancement, démarre l'application indiquée
- envoie dans le pipe désigné un "signal" dès que l'application se termine
avantage :
- l'application est un processus enfant du shell => le programme peut utiliser un wait
- le programme "client" qui veut être informé peut se mettre en attente d'un evt sur le pipe sans consommer de CPU (lecture synchrone)/
inconvénient :
- pour l'instant, seul un/le client peut être informé de la terminaison de l'application
- c'est dingue (je trouve) d'en arriver là. Le besoin me parait simple et légitime. Mais bon je ne prétendrait pas avoir exploré toutes les solutions...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.