Você tem que esperar que os processos morram. Geralmente é uma boa idéia esperar entre um SIGTERM e um SIGKILL.
São consideradas maneiras rudes (e, na minha opinião, pouco profissional) para os processos da SIGKILL sem ter feito um desligamento antes. Isso não só pode criar inconsistências, mas também oculta procedimentos de desligamento defeituosos (programas que não fecham em um determinado momento quando solicitados).
Eu usaria algo como:
# Launch your processes...
DEADLINE=1 #seconds to wait
kill $server1 $server2 $server3
sleep $DEADLINE
if kill -KILL $server1 $server2 $server3
then
echo "Warning: at least one process had not finished in $DEADLINE seconds" >&2
sleep 1 ## Wait for these just-killed processes to actually die and free their ports
fi
Outra abordagem seria encontrar uma porta livre de dentro do próprio servidor (ligação sem uma porta e de alguma forma se comunicando fora da porta designada). Isso permitiria testes paralelos. Você poderia gravar o número da porta em um arquivo especificado na linha de comando (em vez da porta, você passaria o nome do arquivo), alterando assim o -port 7000
para algo como -port auto -port-file test-port.txt
e aguardando a exibição desse arquivo.-master senp://:$(cat test-port.txt)
.
Outra ideia seria descobrir automaticamente, com base nas informações de netstat -ntl
, se as portas necessárias são gratuitas ou não. Em seguida, você pode escolher aguardar ou especificar um novo conjunto de portas disponíveis. As condições de corrida podem muito bem acontecer entre o momento em que você vê uma porta livre e o momento em que realmente se liga, especialmente se seu algoritmo de alocação é determinista e repetível (como usar a primeira porta disponível a partir de 40000). Deixar o sistema operacional escolher uma porta livre é muito mais robusto.