Colete os IDs do processo, mate os processos em segundo plano ao sair.
#!/bin/bash
killbg() {
for p in "${pids[@]}" ; do
kill "$p";
done
}
trap killbg EXIT
pids=()
background job 1 &
pids+=($!)
background job 2... &
pids+=($!)
foreground job
Trapping EXIT
executa a função quando o shell sai, independentemente do motivo. Você pode alterar isso para trap killbg SIGINT
para executá-lo somente em ^C
.
Isso não verifica se um dos processos em segundo plano foi encerrado antes que o script tente filmar. Se o fizerem, você poderá obter erros ou, pior, disparar o processo errado.
Ou mate-os por id do trabalho. Vamos ler a saída de jobs
para descobrir quais ainda estão ativos.
#!/bin/bash
killjobs() {
for x in $(jobs | awk -F '[][]' '{print $2}' ) ; do
kill %$x
done
}
trap killjobs EXIT
sleep 999 &
sleep 1 &
sleep 999 &
sleep 30
Se você executar processos em segundo plano que geram outros processos (como um subshell: (sleep 1234 ; echo foo) &
), será necessário ativar o controle de tarefa com set -m
("modo monitor") para que isso funcione. Caso contrário, apenas o processo de lead será encerrado.