This bash script is thought to automated run processes that may not run forever but may hang sometimes. You can set a timeout after which the script will kill the processes that are still running.
#!/bin/bash # License: BSD License # As Example we start 3 production processes in the background # always record PID in PRODPID sleep 50 & PRODPID[1]=$! sleep 20 & PRODPID[2]=$! # multiple processes in a subshell as example (sleep 20 ; sleep 10 ; sleep 5)& PRODPID[3]=$! export PRODPID # record own PID export PID=$$ # define exit function exit_timeout() { echo "Timeout. These processes are not finished:" for i in ${PRODPID[@]} ; do ps -p $i |grep -v "PID TTY TIME CMD" if [ $? == 0 ] ; then # process still alive echo "Sending SIGTERM to process $i" kill $i fi done # timeout exit exit } # Handler for signal USR1 for the timer trap exit_timeout SIGUSR1 # starting timer in subshell. It sends a SIGUSR1 to the father if it timeouts. export TIMEOUT=30 (sleep $TIMEOUT ; kill -SIGUSR1 $PID) & # record PID of timer TPID=$! # wait for all production processes to finish wait ${PRODPID[*]} # Normal exit echo "All processes ended normal" # kill timer kill $TPID