Killing process groups

Jurjen Bokma

January 2013

Abstract

Kill all your children from a script


I had a script that ran debmirror, which in turn spawns multiple rsyncs, roughly like this:

#~/bin/bash

debmirror ...parameters... &
CHILDPID=$!
wait
    

When I killed that script, it would stop, but the rsyncs would continue to run. First thing to do then is to listen for signals and kill all children when they come in:

#~/bin/bash

debmirror ...parameters... &
trap "kill ${CHILDPID}" SIGHUP SIGQUIT SIGINT SIGTERM
CHILDPID=$!
wait
trap - SIGHUP SIGQUIT SIGINT SIGTERM
    

But then still, some rsyncs would still keep running.

Now I can of course use ps to find all debmirror's children, and kill each separately. But there's a nicer way, namely to start debmirror as a session leader with its own session group id, and kill the entire group:

#!/bin/bash

setsid debmirror ...parameters... &
CHILDPID=$!

trap "echo 'Signal received, killing children before dying' ; sesskill ${CHILDPID}" SIGHUP SIGQUIT SIGINT SIGTERM

wait
trap - SIGHUP SIGQUIT SIGINT SIGTERM