Primeiro, tente um cenário mais simples, como apenas 2 processos FOO1 e FOO2 , e se você fosse executado em um script, por exemplo, denominado parent.sh :
#!/bin/bash
FOO1 &
pid1=$!
echo "Child PID=$pid1 launched"
FOO2 &
pid2=$!
echo "Child PID=$pid2 launched"
BAR exit FOO1
BAR exit FOO2
echo "Pausing to wait for children to finish..."
wait $pid1
wait $pid2
echo "Children finished, moving on."
Veja se isso funciona com os dois FOO s e, se for o caso, implemente para os 20.
Explicação
Como não conseguimos ver as partes internas do processo FOO se BAR , estou confiando apenas no que você postou e, pelo que entendi, você disse
- "Process BAR é usado para verificar o FOO e também é usado para eliminá-lo"
- significando que, em algum momento anterior ao seu snippet publicado, você iniciou
FOO1de alguma forma, para queBAR exit FOO1o afetasse
Entre seu snippet publicado originalmente, você também escreveu:
BAR exit FOO1
PID1=$!
-
$!captura o processo de segundo plano mais recente - mas
BAR exit FOO1não é um processo que entra em segundo plano, é como você afirma, um meio de usar BAR para controlar FOO: "BAR é usado para verificar FOO e também é usado para eliminá-lo" - assim, é improvável que
$!capture% pid de
FOO1
Portanto, assegure-se de que, exatamente onde você inicia um processo FOO *, capture pid. Por exemplo, se você estiver executando tudo em parent.sh e tiver apenas dois processos, você faria:
#!/bin/sh
FOO1 &
pid1=$!
echo "Child PID=$pid1 launched"
FOO2 &
pid2=$!
echo "Child PID=$pid2 launched"
- minúsculas
pid1, você também pode usar maiúsculas originais, desde que consistente, eu prefiro usar minúsculas como convenção para diferenciar de ser confundido com variáveis de ambiente - O echo é um rastreio opcional para que saibamos o que está acontecendo, use-o enquanto estivermos solucionando problemas e comente com
#ou exclua-o assim que tiver resolvido esse problema
Em seguida, executamos os comandos que você reivindicou para verificar e eliminar FOO1 e FOO2 :
BAR exit FOO1
BAR exit FOO2
Então,
echo "Pausing to wait for children to finish..."
wait $pid1
wait $pid2
echo "Children finished, moving on."
- novamente, os
echos são opcionais, mas informativos enquanto você ainda está solucionando isso, nos informa o que está acontecendo -
waitpara cada indivíduo$pid... - seguido por outro
echoopcional para informar quewaiting acabou
CRÉDITO
Exemplo de scripts assíncronos deShotts 2009 na página gratuita do pdf 506