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.
Sending the
-9
signal (SIGKILL
) to a program gives no chance for it to execute its own signal handlers (e.g., yourtrap
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 asSIGTERM
.)See
man 7 signal
for details.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.
Otherwise, orphans will be linked to
init
.Child can ask kernel to deliver
SIGHUP
(or other signal) when parent dies by specifying optionPR_SET_PDEATHSIG
inprctl()
syscall like this:See
man 2 prctl
for details.