killing Parent process along with child process using SIGKILL

21,766

Solution 1

When you kill a process alone, it will not kill the children.

You have to send the signal to the process group if you want all processes for a given group to receive the signal.

kill -9 -parentpid

Otherwise, orphans will be linked to init.

Child can ask kernel to deliver SIGHUP (or other signal) when parent dies by specifying option PR_SET_PDEATHSIG in prctl() syscall like this:

prctl(PR_SET_PDEATHSIG, SIGHUP);

See man 2 prctl for details.

Solution 2

Sending the -9 signal (SIGKILL) to a program gives no chance for it to execute its own signal handlers (e.g., your trap statements). That is why the children don't get killed automatically. (In general, -9 gives no chance for the app to clean up after itself.) You have to use a weaker signal to kill it (such as SIGTERM.)

See man 7 signal for details.

Share:
21,766
user3242440
Author by

user3242440

Updated on July 09, 2022

Comments

  • user3242440
    user3242440 almost 2 years

    I am writing one shell script in which I have parent process and it has child processes which are created by sleep & command. Now I wish to kill the parent process so that the child process will be also killed. I was able to do that this with below command:

    trap "kill $$" SIGINT
    trap 'kill -HUP 0' EXIT
    trap 'kill $(jobs -p)' EXIT
    

    These commands are working with kill [parent_process_ID] commands but if I use kill -9 [parent_process_ID] then only the parent process will be killed. Please guide me further to achieve this functionality so that when I kill parent process with any command then child process should be also killed.

  • user3242440
    user3242440 over 10 years
    I have tried but I think I do not have function called prctl