著者: Vincent Caron 日付: To: guilde 題目: Re: Bash: wait ne rend pas la main
On 11/27/2013 01:53 PM, Vincent Riquer wrote: > Si vous avez des solutions, des idées d'autres tests à faire, ou juste si vous
> avez déjà rencontré le même souci, je suis preneur.
Ca ressemble à une race condition : si 'wait pid' s'exécute bien
c'est que le PID existe bien à ce moment là, puis s'il bloque, c'est que
le SIGCHLD qu'a généré la terminaison de ce process a été bloqué ou
intercepté "ailleurs" entretemps (désolé de ne pas être plus précis).
J'ai jeté un coup d'oeil dans les sources de bash (en cherchant les
occurences de wait_for()), ça ne m'a pas inspiré.
Je peux proposer de transformer l'approche polling en 'événementiel'
qui est moins sujet aux 'race conditions'.
Ex 1: utiliser 'trap SIGCHLD' pour capturer chaque fin de worker,
normalement tu peux faire un wait <pid> dans le trap handler pour
récupérer son status.
Ex 2: intégrer la gestion de la sortie en lançant le worker, dans un
petit wrapper shell (dit autrement, le worker intègre sa propre gestion,
comme le logging, les stats, le timeout, etc) :
( echo "starting work #..." |logger; timeout 600 worker; echo "done,
status is $?" | logger) &
...
wait