Created
July 11, 2012 06:11
-
-
Save rostamizadeh/3088286 to your computer and use it in GitHub Desktop.
Unicorn Upgrade Scripts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
### BEGIN INIT INFO | |
# Provides: unicorn | |
# Required-Start: $remote_fs $syslog | |
# Required-Stop: $remote_fs $syslog | |
# Default-Start: 2 3 4 5 | |
# Default-Stop: 0 1 6 | |
# Short-Description: Manage unicorn server | |
# Description: Start, stop, restart unicorn server for a specific application. | |
### END INIT INFO | |
set -e #if a command ends with non-zero status, exit | |
set -u #if a variable isn't set, exit | |
# Feel free to change any of the following variables for your app: | |
TIMEOUT=${TIMEOUT-60} | |
APP_ROOT=<%= current_path %> | |
PID=<%= unicorn_pid %> | |
CMD="cd <%= current_path %>; bundle exec unicorn -D -c <%= unicorn_config %> -E <%= rails_env %>" | |
AS_USER=<%= unicorn_user %> | |
#When sent a USR2, Unicorn will suffix its pidfile with .oldbin and | |
# immediately start loading up a new version of itself (loaded with a new | |
# version of our app). When this new Unicorn is completely loaded | |
# it will begin spawning workers. The first worker spawned will check to | |
# see if an .oldbin pidfile exists. If so, this means we've just booted up | |
# a new Unicorn and need to tell the old one that it can now die. To do so | |
# we send it a QUIT. | |
OLD_PID="$PID.oldbin" | |
cd $APP_ROOT || exit 1 | |
sig () { | |
test -s "$PID" && kill -$1 `cat $PID` | |
} | |
oldsig () { | |
test -s $OLD_PID && kill -$1 `cat $OLD_PID` | |
} | |
run () { | |
if [ "$(id -un)" = "$AS_USER" ]; then | |
eval $1 | |
else | |
su -c "$1" - $AS_USER | |
fi | |
} | |
workersig () { | |
workerpid="<%= current_path %>/tmp/pids/unicorn.worker.$2.pid" | |
test -s "$workerpid" && kill -$1 `cat $workerpid` | |
} | |
case "$1" in | |
start) | |
sig 0 && echo >&2 "Start failed: Unicorn already running! Exiting!" && exit 0 | |
echo "Starting: " | |
run "$CMD" | |
;; | |
stop) | |
sig QUIT && exit 0 | |
echo >&2 "Stop failed: Unicorn isn't running." | |
;; | |
force-stop) | |
sig TERM && exit 0 | |
echo >&2 "Force-stop failed: Unicorn isn't running" | |
;; | |
restart|reload) | |
sig HUP && echo reloaded OK && exit 0 | |
echo >&2 "Reload failed: executing '$CMD' " | |
run "$CMD" | |
;; | |
upgrade) | |
if test -s $PID; then ORIG_PID=`cat $PID`; else ORIG_PID=0; fi | |
echo 'Original PID: ' $ORIG_PID | |
if sig USR2 | |
then | |
echo 'USR2 sent; Waiting for .oldbin' | |
n=$TIMEOUT | |
#wait for .oldpid to be written | |
while (!(test -s $OLD_PID) && test $n -ge 0) | |
do | |
printf '.' && sleep 1 && n=$(( $n - 1 )) | |
done | |
echo 'Waiting for new pid file' | |
#when this loop finishes, should have new pid file | |
while (!(test -s $PID ) || test -s $OLD_PID) && test $n -ge 0 | |
do | |
printf '.' && sleep 1 && n=$(( $n - 1 )) | |
done | |
if test -s $PID | |
then | |
NEW_PID=`cat $PID` | |
else | |
echo 'New master failed to start; see error log' | |
exit 1 | |
fi | |
#timeout has elapsed, verify new pid file exists | |
if [ $ORIG_PID -eq $NEW_PID ] | |
then | |
echo | |
echo >&2 'New master failed to start; see error log' | |
exit 1 | |
fi | |
echo 'New PID: ' $NEW_PID | |
#verify old master QUIT | |
echo | |
if test -s $OLD_PID | |
then | |
echo >&2 "$OLD_PID still exists after $TIMEOUT seconds" | |
exit 1 | |
fi | |
printf 'Unicorn successfully upgraded' | |
exit 0 | |
fi | |
echo >&2 "Upgrade failed: executing '$CMD' " | |
run "$CMD" | |
;; | |
kill_worker) | |
workersig QUIT $2 && exit 0 | |
echo >&2 "Kill Worker failed: worker not running" | |
;; | |
reopen-logs) | |
sig USR1 | |
;; | |
*) | |
echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>" | |
exit 1 | |
;; | |
esac |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
upgrade) | |
if test -s $PID; then ORIG_PID=`cat $PID`; else ORIG_PID=0; fi | |
echo 'Original PID: ' $ORIG_PID | |
if sig USR2 | |
then | |
echo 'USR2 sent; Waiting for .oldbin' | |
n=$TIMEOUT | |
#wait for .oldpid to be written | |
while (!(test -s $OLD_PID) && test $n -ge 0) | |
do | |
printf '.' && sleep 1 && n=$(( $n - 1 )) | |
done | |
echo 'Waiting for new pid file' | |
#when this loop finishes, should have new pid file | |
while (!(test -s $PID ) || test -s $OLD_PID) && test $n -ge 0 | |
do | |
printf '.' && sleep 1 && n=$(( $n - 1 )) | |
done | |
if test -s $PID | |
then | |
NEW_PID=`cat $PID` | |
else | |
echo 'New master failed to start; see error log' | |
exit 1 | |
fi | |
#timeout has elapsed, verify new pid file exists | |
if [ $ORIG_PID -eq $NEW_PID ] | |
then | |
echo | |
echo >&2 'New master failed to start; see error log' | |
exit 1 | |
fi | |
echo 'New PID: ' $NEW_PID | |
#verify old master QUIT | |
echo | |
if test -s $OLD_PID | |
then | |
echo >&2 "$OLD_PID still exists after $TIMEOUT seconds" | |
exit 1 | |
fi | |
printf 'Unicorn successfully upgraded' | |
exit 0 | |
fi | |
echo >&2 "Upgrade failed: executing '$CMD' " | |
run "$CMD" | |
;; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment