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
FOO1
de alguma forma, para queBAR exit FOO1
o 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 FOO1
nã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
echo
s são opcionais, mas informativos enquanto você ainda está solucionando isso, nos informa o que está acontecendo -
wait
para cada indivíduo$pid
... - seguido por outro
echo
opcional para informar quewait
ing acabou
CRÉDITO
Exemplo de scripts assíncronos deShotts 2009 na página gratuita do pdf 506