Se você digitar
command 1 & command 2
isso é igual a
command 1 &
command 2
i.e. isso executará o primeiro comando em segundo plano e, em seguida, executará o segundo comando em primeiro plano. Isso significa que o echo "done"
é impresso depois que command 2
terminar, mesmo se command 1
ainda estiver em execução.
Você provavelmente quer
command 1 &
command 2 &
wait
echo "done"
Isso executará os dois comandos em segundo plano e aguardará a conclusão de ambos.
Se você pressionar CTRL-C, somente o sinal SIGINT será enviado para o processo de primeiro plano, ou seja, command 2
na sua versão ou wait
na minha versão.
Sugiro configurar uma armadilha como esta:
#!/bin/bash
trap killgroup SIGINT
killgroup(){
echo killing...
kill 0
}
loop(){
echo $1
sleep $1
loop $1
}
loop 1 &
loop 2 &
wait
Com o trap o sinal SIGINT produzido pelo CTRL-C é capturado e substituído pela função killgroup
, que mata todos esses processos.