5

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.

0x5C91
  • 3,360
  • 3
  • 31
  • 46
user3242440
  • 101
  • 2
  • 2
  • 4

2 Answers2

11

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.

Jayesh Bhoi
  • 24,694
  • 15
  • 58
  • 73
5

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.

jpaugh
  • 6,634
  • 4
  • 38
  • 90