provavelmente (eu devo verificar para ter certeza) mas em qualquer caso você pode armazenar os PIDs dos processos bifurcados e matá-los na saída:
my_forked_process & my_forked_pid=$!
desde que você disse "outros shells" eu diria que há alguns, então devemos usar um array:
my_forked_pids=()
my_forked_process1 & my_forked_pids+=($!)
my_forked_process2 & my_forked_pids+=($!)
então você os mata assim ao sair:
for pid in "${my_forked_pids[@]}"; do
kill "$pid"
done
[bônus] se você colocar o anterior em uma função, você pode definir um trap
para executá-lo quando o script sair, independentemente do momento (segurança para quando ele é eliminado prematuramente):
trap cleanup_function 0
0 é um sinal especial que significa "na saída"