Question

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

Was it helpful?

Solution 2

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

OTHER TIPS

This works for me:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
  • kill -- -$$ sends a SIGTERM to the whole process group, thus killing also descendants.

  • Specifying signal EXIT is useful when using set -e (more details here).

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.

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top