about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-10-30 21:10:38 +0000
committerEric Wong <e@80x24.org>2016-10-30 21:10:38 +0000
commitdde44f1570112ee95a7eb766105d988ce70f1278 (patch)
tree91b1238a7c3f88c3e31a1a094be02e0e5c9a957a
parentc47d13d2c5ce75cca5ac11eda6d6a0e54015e711 (diff)
parent6a65054ce2763d51aca5da525656bcb1f08d61a5 (diff)
downloadunicorn-dde44f1570112ee95a7eb766105d988ce70f1278.tar.gz
* origin/jr/init:
  examples/init.sh: update to reduce upgrade raciness
-rw-r--r--examples/init.sh44
1 files changed, 36 insertions, 8 deletions
diff --git a/examples/init.sh b/examples/init.sh
index 1f0e035..4ef6cdc 100644
--- a/examples/init.sh
+++ b/examples/init.sh
@@ -1,7 +1,16 @@
 #!/bin/sh
 set -e
+### BEGIN INIT INFO
+# Provides:          unicorn
+# Required-Start:    $local_fs $network
+# Required-Stop:     $local_fs $network
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Start/stop unicorn Rack app server
+### END INIT INFO
+
 # Example init script, this can be used with nginx, too,
-# since nginx and unicorn accept the same signals
+# since nginx and unicorn accept the same signals.
 
 # Feel free to change any of the following variables for your app:
 TIMEOUT=${TIMEOUT-60}
@@ -9,21 +18,22 @@ APP_ROOT=/home/x/my_app/current
 PID=$APP_ROOT/tmp/pids/unicorn.pid
 CMD="/usr/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb"
 INIT_CONF=$APP_ROOT/config/init.conf
+UPGRADE_DELAY=${UPGRADE_DELAY-2}
 action="$1"
 set -u
 
 test -f "$INIT_CONF" && . $INIT_CONF
 
-old_pid="$PID.oldbin"
+OLD="$PID.oldbin"
 
 cd $APP_ROOT || exit 1
 
 sig () {
-        test -s "$PID" && kill -$1 `cat $PID`
+        test -s "$PID" && kill -$1 $(cat $PID)
 }
 
 oldsig () {
-        test -s $old_pid && kill -$1 `cat $old_pid`
+        test -s "$OLD" && kill -$1 $(cat $OLD)
 }
 
 case $action in
@@ -45,18 +55,36 @@ restart|reload)
         $CMD
         ;;
 upgrade)
-        if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
+        if oldsig 0
+        then
+                echo >&2 "Old upgraded process still running with $OLD"
+                exit 1
+        fi
+
+        cur_pid=
+        if test -s "$PID"
+        then
+                cur_pid=$(cat $PID)
+        fi
+
+        if test -n "$cur_pid" &&
+                        kill -USR2 "$cur_pid" &&
+                        sleep $UPGRADE_DELAY &&
+                        new_pid=$(cat $PID) &&
+                        test x"$new_pid" != x"$cur_pid" &&
+                        kill -0 "$new_pid" &&
+                        kill -QUIT "$cur_pid"
         then
                 n=$TIMEOUT
-                while test -s $old_pid && test $n -ge 0
+                while kill -0 "$cur_pid" 2>/dev/null && test $n -ge 0
                 do
                         printf '.' && sleep 1 && n=$(( $n - 1 ))
                 done
                 echo
 
-                if test $n -lt 0 && test -s $old_pid
+                if test $n -lt 0 && kill -0 "$cur_pid" 2>/dev/null
                 then
-                        echo >&2 "$old_pid still exists after $TIMEOUT seconds"
+                        echo >&2 "$cur_pid still running after $TIMEOUT seconds"
                         exit 1
                 fi
                 exit 0