Eu escrevi um script de shell iniciando alguns processos em segundo plano e precisava ter certeza de matá-los todos ao sair. Acontece que não é tão fácil quanto se poderia esperar. Isso é o que acabei fazendo:
Primeiro você precisa capturar alguns sinais para executar uma função de desligamento. Nessa função, primeiro precisamos obter nosso id de grupo de processo, em seguida, eliminar o grupo de processo completo em um novo grupo de processo para que não corramos o risco de nos matar:
#!/bin/bash
shutdown() {
# Get our process group id
PGID=$(ps -o pgid= $$ | grep -o [0-9]*)
# Kill it in a new new process group
setsid kill -- -$PGID
exit 0
}
trap "shutdown" SIGINT SIGTERM
... # start gazillion of background processes here