O shell definitivamente não matará espontaneamente seus subprocessos - afinal, um trabalho em segundo plano deve ser executado em segundo plano e não se importar com a vida de seu pai. (Em alguns casos, um shell interativo mata seus subprocessos quando sai - o que nem sempre é desejável, portanto nohup
. )
Você pode fazer com que o script de shell mate seus trabalhos em segundo plano quando ele sair ou for eliminado por um sinal acessível. Registre os IDs do processo dos jobs e mate-os de uma armadilha. Observe que isso apenas mata as tarefas (como no processo original iniciado em segundo plano), não seus subprocessos.
jobs=()
trap '((#jobs == 0)) || kill $jobs' EXIT HUP TERM INT
…
subscript1 & jobs+=($!)
subscript2 & jobs+=($!)
…
Se você quer matar todos os processos e seus subprocessos, mais planejamento está em ordem. Um método é organizar todos os processos para que um arquivo único seja aberto. Para matar todos eles, mate todos os processos que possuem este arquivo aberto. Um subprocesso pode escapar fechando o arquivo.
#!/bin/sh
lock_file=$(mktemp)
exec 3<"$lock_file"
your_script
status=$?
exec 3<&-
fuser -k "$lock_file"
exit $status