views:

1553

answers:

4

I want to write a shell script that spawns several long-running processes in the background, then hangs around. Upon receiving SIGTERM, I want all the subprocesses to terminate as well.

Basically, I want a "master process".

Here's what I got so far:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait

The above script fails with trap: 10: SIGTERM: bad trap.

Edit: I'm using Ubuntu 9.04

+1  A: 

This script looks correct and works for me as expected.

How do you send the SIGTERM signal to the "master process"? Maybe you should execute kill -l to check which signals are supported. As the error message suggests you send signal "10" which your system doesn't seem to recognize.

And next time you should add operating system, shell version, kernel, ... for such a question

Thanks for the response. I'm using Ubuntu 9.04, and reading your answer I realized this was probably a bash vs. dash thing. It indeed works as advertised if I change the first line to #!/bin/bash
itsadok
+1  A: 

I suspect your /bin/sh is not a Bash (though you tagged the question as 'Bash').

From the message I guess it's a DASH. Check its manual or just fix your shebang if you need to write Bash code.

TheBonsai
+1  A: 

Joe's answer put me on the right track. I also found out I should trap more signals to cover my bases.

Final script looks like this:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait
itsadok
If you think you have to use signal numbers, you should only use the standardized ones. But I siggest to use your system's signal names instead.
TheBonsai
You're right. I hope this is the last version...
itsadok
Well, it's your code, you can have as many versions as wanted ;-)
TheBonsai
A: 

This is usually the simplest and more portable solution:

trap "kill 0" ...

[edited]

"kill 0" sends a signal to the process group, take a look at:

http://www.opengroup.org/onlinepubs/009695399/functions/kill.html

The most common usage is:

trap "kill 0" SIGINT SIGTERM EXIT

Specifying "EXIT" is very useful if your script has "set -e" and an error happens. See:

http://www.davidpashley.com/articles/writing-robust-shell-scripts.html

tokland
What does pid 0 mean? And do you mean the `...` literally, or as a placeholder?
itsadok
Answer edited to reply your questions. I hope now is more clear.
tokland