start_devserver: cleaner handling of signals

This simplified and robustifies the signal handling and termination of
the child process (devserver) in several ways:

* There's no need to set a flag when trapping a signal: it is sufficient
  to check the return status of the wait built-in (if >= 128, it was
  interrupted by a signal).

* Be sure to wait for the subprocess' termination, regardless of
  repeated signals. This ensures that we do not leave zombie devservers
  behind.

* Note that this may send multiple SIGTERMs to the child process (one
  for each signal trapped by start_devserver).  This is probably
  harmless, and makes the code simpler.

BUG=None
TEST=devserver killed cleanly

Change-Id: Ibe648285b461048f681e464ab2ba6c9a7445841d
Reviewed-on: https://gerrit.chromium.org/gerrit/32114
Reviewed-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Richard Barnette <jrbarnette@chromium.org>
Commit-Ready: Gilad Arnold <garnold@chromium.org>
Tested-by: Gilad Arnold <garnold@chromium.org>
diff --git a/host/start_devserver b/host/start_devserver
index 00da1c8..1876950 100755
--- a/host/start_devserver
+++ b/host/start_devserver
@@ -14,8 +14,8 @@
 
 export DEFAULT_INSTALL_MASK
 
-# Trap various signals.
-trap 'trap_flag=1' INT TERM QUIT
+# Trap various signals (but do nothing about it).
+trap : INT TERM QUIT
 
 # Spawn devserver in the background, record its pid.
 if [ -f /usr/lib/devserver/devserver.py ]; then
@@ -25,10 +25,10 @@
 fi
 devserver_pid=$!
 
-# Wait for devserver to die, or a signal.
+# Wait for devserver to terminate. If we're interrupted by a signal, kill the
+# devserver and wait for it to die.
 wait
-
-# If interrupted by signal, kill the devserver.
-if [ -n "${trap_flag}" ]; then
+while [ $? -ge 128 ]; do
   kill ${devserver_pid}
-fi
+  wait
+done