笔记: Unicorn & LSB init.d


总算找到一个好用的脚本, 能将多个 unicorn 实例集成到 Linux 的系统服务中, 这样就不必担心重新启动后 unicorn 是否运行了.
/etc/init.d/unicorn:

#!/bin/sh
#
# init.d script for single or multiple unicorn installations. Expects at least one .conf
# file in /etc/unicorn
#
# Modified by [email protected] http://github.com/jaygooby
# based on http://gist.github.com/308216 by http://github.com/mguterl
#
## A sample /etc/unicorn/my_app.conf
##
## RAILS_ENV=production
## RAILS_ROOT=/var/apps/www/my_app/current
#
# This configures a unicorn master for your app at /var/apps/www/my_app/current running in
# production mode. It will read config/unicorn.rb for further set up.
#
# You should ensure different ports or sockets are set in each config/unicorn.rb if
# you are running more than one master concurrently.
#
# If you call this script without any config parameters, it will attempt to run the
# init command for all your unicorn configurations listed in /etc/unicorn/*.conf
#
# /etc/init.d/unicorn start # starts all unicorns
#
# If you specify a particular config, it will only operate on that one
#
# /etc/init.d/unicorn start /etc/unicorn/my_app.conf

### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    mysql networking
# Required-Stop:     mysql networking
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: This daemon is for unicorns
# Description:       Starts or stops all unicorns in /etc/unicorn/*.conf
### END INIT INFO
AS_USER=deploy

set -e

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
}

cmd () {

  case $1 in
    start)
      sig 0 && echo >&2 "Already running" && continue
      echo "Starting"
      run "$CMD"
      ;;
    stop)
      sig QUIT && echo "Stopping" && continue
      echo >&2 "Not running"
      ;;
    force-stop)
      sig TERM && echo "Forcing a stop" && continue
      echo >&2 "Not running"
      ;;
    restart|reload)
      sig USR2 && sleep 5 && oldsig QUIT && echo "Killing old master" `cat $OLD_PID` && continue
      echo >&2 "Couldn't reload, starting '$CMD' instead"
      run $CMD
      ;;
    upgrade)
      sig USR2 && echo Upgraded && continue
      echo >&2 "Couldn't upgrade, starting '$CMD' instead"
      run $CMD
      ;;
    rotate)
            sig USR1 && echo rotated logs OK && continue
            echo >&2 "Couldn't rotate logs" && exit 1
            ;;
    *)
      echo >&2 "Usage: $0 "
      exit 1
      ;;
    esac
}

setup () {

  echo -n "$RAILS_ROOT: "
  export PID=$RAILS_ROOT/tmp/pids/unicorn.pid
  export OLD_PID="$PID.oldbin"

  CMD="cd $RAILS_ROOT ; bundle exec unicorn -c config/unicorn.rb -E $RAILS_ENV -D"
}

start_stop () {

  # either run the start/stop/reload/etc command for every config under /etc/unicorn
  # or just do it for a specific one

  # $1 contains the start/stop/etc command
  # $2 if it exists, should be the specific config we want to act on
  if [ $2 ]; then
    . $2
    setup
    cmd $1
  else
    for CONFIG in /etc/unicorn/*.conf; do
      # import the variables
      . $CONFIG
      setup

      # run the start/stop/etc command
      cmd $1
    done
   fi
}

ARGS="$1 $2"
start_stop $ARGS

😀


One response to “笔记: Unicorn & LSB init.d”