Há alguns problemas aqui:
- Conseguir que o script inteiro seja abortado se um comando em um subshell falhar.
- Aumentar a visibilidade de quaisquer erros que ocorram.
Vou começar com o segundo.
A questão contém a semente da resposta: os erros são registrados,
mas o conteúdo dos logs não é óbvio para o usuário.
Portanto, registre os erros (em um arquivo de log ad-hoc) e exiba-os no final:
services=(
account-service
reminder-service
activity-service
socket-service
chat-service
web-app
)
errfile=$(mktemp)
for s in "${services[@]}"; do
(
set -e;
cd "$s"
git pull || {
echo "$s" >> "$errfile"
exit 1
}
echo "$cmd" | bash
) &
sleep 1
done
wait
if [ -s "$errfile" ]
then
echo "The following service(s) had errors:"
cat "$errfile"
fi
rm -f "$errfile"
A maneira mais simples de resolver o problema nº 1
é ter o código na subshell (s) verificar [ -s "$errfile" ]
periodicamente,
e aborte-se caso surja algum problema.
Uma abordagem mais ambiciosa seria
ter o processo principal (pai) acompanhar os PIDs das crianças
e enviá-los sinais.
Não sei como você faria isso sem wait -n
.
(Talvez você possa ter um filho com um erro enviar um sinal para o pai
para dividi-lo do wait
.)