diff --git a/bin/singlestart.sh b/bin/singlestart.sh
index c6b814a031a13dfa7ceae569092ac983be0b9cf6..3c00a45dd346d32044dc5fe46399ae464717b4e4 100755
--- a/bin/singlestart.sh
+++ b/bin/singlestart.sh
@@ -9,6 +9,20 @@ bootnodekeyfile=${BFANETWORKDIR}/bootnode/key
 
 # Bail out if anything fails.
 trap "exit 1" ERR
+unset LOGDIR LOGPIPE PIDIDX
+declare -A PIDIDX
+
+function reaper()
+{
+    local rc
+    for pid in ${!PIDIDX[*]}
+    do
+        kill -0 $pid 2>/dev/null && continue
+        rc=wait $pid
+        echo "${PIDIDX[$pid]} (pid $pid) has exited with value $rc" 
+        unset aaa[$pid]
+    done
+}
 
 if [ "$VIRTUALIZATION" = "DOCKER" ]
 then
@@ -47,35 +61,40 @@ then
     echo "or: docker exec -i bfanode bfalog.sh"
 fi
 
-unset LOGDIR LOGPIPE PIDLIST
-
 echo "*** Setting up logging."
 # Clean up logging
 LOGDIR=$( mktemp -d )
-trap "rm -f ${LOGDIR}" EXIT
+trap "rm -rf ${LOGDIR}" EXIT
 LOGPIPE=${LOGDIR}/logpipe
 mknod ${LOGPIPE} p
 ${BFAHOME}/bin/log.sh ${BFANODEDIR}/log < ${LOGPIPE} &
-PIDLIST="${PIDLIST} $!"
+PIDIDX[$!]="log.sh"
 
 echo "*** Starting geth."
 geth --config ${BFATOML} --gcmode archive --verbosity ${BFAVERBOSITY:-3} --allow-insecure-unlock > ${LOGPIPE} 2>&1 &
-PIDLIST="${PIDLIST} $!"
+PIDIDX[$!]="geth"
 
 # bootnode
 if [ -r "$bootnodekeyfile" ]
 then
     echo "*** Starting bootnode."
-    bootnode --nodekey $bootnodekeyfile &
-    PIDLIST="${PIDLIST} $!"
+    bootnode --nodekey $bootnodekeyfile > ${LOGPIPE} 2>&1 &
+    PIDIDX[$!]="bootnode"
 fi
 
 echo "*** Starting monitor.js"
-monitor.js &
-PIDLIST="${PIDLIST} $!"
+monitor.js > ${LOGPIPE} 2>&1 &
+PIDIDX[$!]="monitor.js"
 
 wait -n             # if one dies
-echo "*** Some process ended, so will shut down other processes too." > ${LOGPIPE}
 sleep 2             # give log.sh time to work on the data written, before we kill it.
-kill ${PIDLIST}     # kill all
-wait                # wait for them all to end
+echo "*** Some process ended, so will shut down other processes too." > ${LOGPIPE}
+kill ${!PIDIDX[*]} 2>/dev/null || true  # kill all
+# wait for them all to end
+max=30
+while [ -n "${!PIDIDX[*]}" -a $max -gt 0 ]
+do
+    sleep 1
+    max=$(( $max - 1 ))
+done
+kill -KILL ${!PIDIDX[*]} 2>/dev/null || true