views:

644

answers:

1

I want to trap a signal send from Script-A.sh to Script-B.sh so in Script-A.sh i use the command

(Send SIGINT to Script-B.sh)
kill -2 $PID_Script-B.sh

And in Script-B.sh i catch the signal and call function Clean

trap 'Clean' 2

It does not work, instead the Script-B.sh is killed right away without performing the Clean !!

What i notice also is that if i want to send SIGINT from terminal to any script that traps it, a ctrl-c will be catched correctly, but not if i specify the signal via the command kill -2 $pid_of_script

Any idea about the difference between the two method to send the SIGINT (ctrl-c VS kill -2 $pid_of_script), and how i can send a SIGINT from a script to another ?

Regards,

Debugger

+3  A: 

I was able to reproduce the behavior you report. My hypothesis is that since the script is running from a non-interactive shell (as a child of a script) that SIGINT, which is a keyboard signal, is ignored.

From info bash:

       Background processes are those whose process group ID differs from the 
       terminal's; such processes are immune to keyboard-generated signals.

I have found that if you trap and kill using another signal such as SIGUSR1 it works.

Additional information from man bash:

       Non-builtin commands run by bash have signal handlers set to the values
       inherited  by  the  shell  from its parent.  When job control is not in
       effect, asynchronous commands ignore SIGINT and SIGQUIT in addition  to
       these  inherited handlers.

and

       If bash is waiting for a command to complete and receives a signal  for
       which a trap has been set, the trap will not be executed until the com‐
       mand completes.

and

       Any trap on SIGCHLD  is  executed  for  each  child  that
       exits.
Dennis Williamson
That first bit from bash(1) seems like a explanation. Also, *zsh* seems to work OK.
Chris Johnsen
Sorry for this late answer. You are right, not all signals are able to be catched for children but some. SIGUSR1 worked for me as well as SIGTERM, But not in all bash versions, cause i got a segmentation fault from a script in bash 3.00.16 when trying to send the signal from father to son !!! Other times using the same version it will just ignore the signal without catching it (in children level). But newer versions work well and propagate correctly all the signals. Thank you very much for your help