FIX: force all sub processes to stop on TERM, wait for them to finish
authorSam <sam.saffron@gmail.com>
Tue, 26 Jan 2016 05:25:37 +0000 (16:25 +1100)
committerSam <sam.saffron@gmail.com>
Tue, 26 Jan 2016 05:25:37 +0000 (16:25 +1100)
This works around docker bug where containers will not stop

image/base/Dockerfile
image/base/boot

index 0ee8c6f024de707b7c466117a813c1d5b7aaf20a..49924e11c9013d3ebb6ff09e33ceaa97a34a64a4 100644 (file)
@@ -29,7 +29,7 @@ RUN echo "debconf debconf/frontend select Teletype" | debconf-set-selections &&\
     apt-get -y install build-essential git curl wget \
                        libxslt-dev libcurl4-openssl-dev \
                        libssl-dev libyaml-dev libtool \
-                       libxml2-dev gawk \
+                       libxml2-dev gawk parallel \
                        postgresql-9.3 postgresql-client-9.3 \
                        postgresql-contrib-9.3 libpq-dev libreadline-dev \
                        nginx language-pack-en sudo cron anacron \
index 38b5294f73a47f77375eb226a626fd0df026ab81..3e46a06a15d312227d34b7d8205e9847911215e7 100755 (executable)
@@ -2,9 +2,26 @@
 
 # we use this to boot up cause runit will not handle TERM and will not exit when done
 
+shutdown() {
+  echo Shutting Down
+  /etc/runit/3
+  ls /etc/service | SHELL=/bin/sh parallel sv force-stop {}
+  kill -HUP $RUNSVDIR
+  wait $RUNSVDIR
+
+  # give stuff a bit of time to finish
+  sleep 0.1
+
+  ORPHANS=`ps -eo pid | grep -v PID  | tr -d ' ' | grep -v '^1$'`
+  SHELL=/bin/bash parallel 'timeout 5 /bin/bash -c "kill {} && wait {}" || kill -9 {}' ::: $ORPHANS 2> /dev/null
+  exit
+}
+
 /etc/runit/1
 /etc/runit/2&
 RUNSVDIR=$!
 echo "Started runsvdir, PID is $RUNSVDIR"
-trap "echo Shutting Down && /etc/runit/3 && kill -HUP $RUNSVDIR && wait $RUNSVDIR" SIGTERM SIGHUP
+trap shutdown SIGTERM SIGHUP
 wait $RUNSVDIR
+
+shutdown