I have an collection of scripts which are controlled by a main one. I want to trap the signal ctrl+c in the main script and propagate it to the others. The other scripts should trap this signal as well ( from the main script ) and do some clean-up ...
I have tried to send kill -s SIGINT
to the children, but they seem they are unable to catch the signal( even if trap 'Cleanup' SIGINT
being defined on the children scripts )
Any clues how to realize this?
$# - How many arguments were passed to the Bash script. $@ - All the arguments supplied to the Bash script. $? - The exit status of the most recently run process. $$ - The process ID of the current script. $USER - The username of the user running the script.
The trap command is frequently used to clean up temporary files if the script exits due to interruption. The following example defines the cleanup function, which prints a message, removes all the files added to the $TRASH variable, and exits the script. $TRASH=$(mktemp -t tmp.
Meaning. $! $! bash script parameter is used to reference the process ID of the most recently executed command in background.
SIGINT is the signal sent when we press Ctrl+C. The default action is to terminate the process. However, some programs override this action and handle it differently. One common example is the bash interpreter.
The following example demonstrates a parent script that does something (sleep 5
) after it starts two children that do their own thing (also sleep 5
). When the parent exits (for whatever reason) it signals the children to terminate (don't SIGINT
, termination is signaled by SIGTERM
, also the default kill
signal). The children then do their thing on reception of SIGTERM
. If the children are scripts of their own, I recommend you change the trap on TERM
into a trap on EXIT
so that the children clean up no matter what the cause of their termination be (so long as it's trappable).
Notice my use of wait
. Bash does not interrupt running non-builtin commands when it receives a signal. Instead, it waits for them to complete and handles the signal after the command is done. If you use wait
, bash stops waiting immediately and handles the signal right away.
#!/usr/bin/env bash
trap 'echo parent shutting down; kill $(jobs -p)' EXIT
{ trap 'echo child 1 signaled' TERM; sleep 5 & wait; } &
{ trap 'echo child 2 signaled' TERM; sleep 5 & wait; } &
sleep 5
Have you tried to : 1) Setup your traps in every script (master / childs) where you need them 2) Send to the master a kill with it's PID negated, to kill the whole process group, I mean :
kill -15 -$PID
man kill | grep -C1 Negative
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With