killall5 returns 2 if it didn't find any processes to send to. Using this 
avoids sleeping longer than needed. This saves another up to six seconds of 
reboot/shutdown/go-single time.
---
 functions |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/functions b/functions
index 9cc9cc6..71d0312 100644
--- a/functions
+++ b/functions
@@ -310,14 +310,25 @@ kill_everything() {
        run_hook "$1_prekillall"
 
        # Terminate all processes
+       # and wait until timeout or killall5 reports all done
+       # Unfortunately killall5 does not support the 0 signal, so just
+       # use SIGCONT for checking (which should be ignored).
        stat_busy "Sending SIGTERM To Processes"
+               local i
                killall5 -15 ${omit_pids[@]/#/-o } &>/dev/null
-               sleep 5
+               for (( i=0; i<20 && $?!=2; i++ )); do
+                       sleep .25 # 1/4 second
+                       killall5 -18 ${omit_pids[@]/#/-o } &>/dev/null
+               done
        stat_done
 
        stat_busy "Sending SIGKILL To Processes"
+               local i
                killall5 -9 ${omit_pids[@]/#/-o } &>/dev/null
-               sleep 1
+               for (( i=0; i<4 && $?!=2; i++ )); do
+                       sleep .25 # 1/4 second
+                       killall5 -18 ${omit_pids[@]/#/-o } &>/dev/null
+               done
        stat_done
 
        run_hook "$1_postkillall"
-- 
1.7.1

Reply via email to