Maybe this universal start/stop script will help you. First enable cgroups support in OS, this is example for RHEL 6:
chkconfig cgconfig on chkconfig cgred on
and reboot.
Now comes script.
What you have to specify is STARTFILE - name of program, which doesnt have correct start/stop script and does spawn many other programs as children. Next specify unique name for CGROUP, under which we will track PIDs of spawned children. It can be any name. (#exec line I use for debugging, is not really needed).
In start part, I send pid of current (this) script running to prepared cgroup, which does tracking of pids for us. Then I run script STARTFILE as user "username".
In stop part script first send kill to all pids in CGROUP, after 1 second checks if there are any pids still running and if yes, after 10 seconds it sends kill -9. You can increase this delay, or even make a loop to periodicaly check for pids existence, its up to you.
# cat /etc/init.d/impex-onl #!/bin/bash #exec >> /tmp/testing 2>&1 STARTFILE=/opt/cdaenvs/suprod/work/impex-onl/bin/impex-start.sh CGROUP=impexonl #### dont edit after this line ##### PIDFILE=/cgroup/cpu/$CGROUP/tasks existing_pids () { ( ps --no-header -e -o pid | tr -d ' ' ; cat $PIDFILE ) | sort | uniq -d } cgcreate -g cpu:$CGROUP start() { echo "echo $$ > $PIDFILE" echo $$ > $PIDFILE echo "starting $STARTFILE" >> /dev/stderr su -l -c "$STARTFILE" username } stop() { existing_pids | while read i; do kill $i done sleep 1 lines=`existing_pids|wc -l` if test "$lines" -gt 0; then sleep 10; existing_pids | while read i; do kill -9 $i done fi } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) echo -n "Pids of running $CGROUP processes: " >> /dev/stderr existing_pids | xargs echo >> /dev/stderr lines=`existing_pids|wc -l` if test "$lines" -gt 0; then exit 0 else exit 3 fi ;; restart|reload|force-reload) stop start ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}" exit 1 esac exit 0