Desta resposta: bash - Como matar todos os subprocessos do shell? - estouro de pilha .
Se você só se preocupa em matar crianças, você deve ser capaz de fazer
pkill -P $$
-P
diz
-P, --parent ppid,...
Only match processes whose parent process ID is listed.
E $$
significa o PID do processo atual.
Se você precisar eliminar processos filhos e quaisquer processos que eles possam iniciar (netos, e assim por diante), você poderá usar a função que está em uma resposta diferente para essa pergunta:
kill_descendant_processes() {
local pid="$1"
local and_self="${2:-false}"
if children="$(pgrep -P "$pid")"; then
for child in $children; do
kill_descendant_processes "$child" true
done
fi
if [[ "$and_self" == true ]]; then
kill "$pid"
fi
}
Como isso
kill_descendant_processes $$ true
Qual vai matar o processo atual e todos os descendentes. Você provavelmente vai querer chamar isso de um manipulador de armadilha. Ou seja, quando você pressionar ctrl + c , seu script será enviado SIGINT
e você poderá capturar esse sinal e manipulá-lo. Por exemplo:
trap cleanup INT
cleanup() {
kill_descendant_processes $$ true
}