Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/jr/init'
Browse files Browse the repository at this point in the history
* origin/jr/init:
  examples/init.sh: update to reduce upgrade raciness
  • Loading branch information
Eric Wong committed Oct 30, 2016
2 parents c47d13d + 6a65054 commit dde44f1
Showing 1 changed file with 36 additions and 8 deletions.
44 changes: 36 additions & 8 deletions examples/init.sh
@@ -1,29 +1,39 @@
#!/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}
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
Expand All @@ -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
Expand Down

0 comments on commit dde44f1

Please sign in to comment.