雑多なインフラエンジニア日記

技術ブログでっす~

Ruby unicorn 起動スクリプト

unicorn 起動スクリプトを作成してみました。

というか、OS標準のrubyがインストールされている状態で、別Verのruby
ソースインストールしたら、OSリブート時にunicornが自動起動されなかったので
メモ。
ちなみに、手動で起動スクリプトをキックした場合は正常に動作する状態です。

OSリブート時のエラーメッセージ

/usr/lib/ruby/site_ruby/1.8/rubygems/dependency.rb:247:in `to_specs': Could not find unicorn (>= 0) amongst [aws-sdk-1.8.1.2, json-1.4.6, nokogiri-1.5.6, uuidtools-2.1.1] (Gem::LoadError)
     from /usr/lib/ruby/site_ruby/1.8/rubygems/dependency.rb:256:in `to_spec'
     from /usr/lib/ruby/site_ruby/1.8/rubygems.rb:1211:in `gem'
     from /usr/local/ruby/bin/unicorn:22



結果、スクリプト内に export PATH=/usr/local/ruby/bin:$PATH が必要でした。
以下の #gem env > /tmp/gem-env.txt を仕込む事により、原因を突き止めました。

/etc/init.d/unicorn

#!/bin/sh
# unicorn - this script starts and stops the unicorn daemon
#
# chkconfig: 2345 70 23
# description:  unicorn
# processname: unicorn

set -e
TIMEOUT=${TIMEOUT-60}
export PATH=/usr/local/ruby/bin:$PATH
#export GEM_HOME=/usr/local/ruby-1.9.3-p286/lib/ruby/gems/1.9.1
#export RUBYLIB=/usr/local/ruby-1.9.3-p286/lib/ruby/gems/1.9.1
APP_ROOT=/pathto/xxxx
PID=/var/run/unicorn.pid
CMD="/usr/local/ruby/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
#CMD="/usr/local/ruby/bin/unicorn_rails -D -c $APP_ROOT/config/unicorn.rb -E production"
#CMD="bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
#gem env > /tmp/gem-env.txt
action="$1"
set -u


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`
}

case $action in
start)
        sig 0 && echo >&2 "Already running" && exit 0
        $CMD  && printf "\e[36m Started success. \e[m\n"
        ;;
stop)
        sig QUIT && printf "\e[36m Stopped success. \e[m\n" && exit 0
        echo >&2 "Not running"
        ;;
force-stop)
        sig TERM && exit 0
        echo >&2 "Not running"
        ;;
restart|reload)
        sig HUP && echo reloaded OK && exit 0
        echo >&2 "Couldn't reload, starting '$CMD' instead"
        $CMD
        ;;
upgrade)
        if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
        then
                n=$TIMEOUT
                while test -s $old_pid && test $n -ge 0
                do
                        printf '.' && sleep 1 && n=$(( $n - 1 ))
                done
                echo

                if test $n -lt 0 && test -s $old_pid
                then
                        echo >&2 "$old_pid still exists after $TIMEOUT seconds"
                        exit 1
                fi
                exit 0
        fi
        echo >&2 "Couldn't upgrade, starting '$CMD' instead"
        $CMD
        ;;
reopen-logs)
        sig USR1
        ;;
*)
        echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
        exit 1
        ;;
esac


OS起動時の gem env

RubyGems Environment:
- RUBYGEMS VERSION: 1.8.11
- RUBY VERSION: 1.8.7 (2012-10-12 patchlevel 371) [x86_64-linux]

- INSTALLATION DIRECTORY: /usr/lib/ruby/gems/1.8
- RUBY EXECUTABLE: /usr/bin/ruby
- EXECUTABLE DIRECTORY: /usr/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /usr/lib/ruby/gems/1.8
- /.gem/ruby/1.8
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- http://rubygems.org/


OS起動後の gem env (使いたいのはこっち)

RubyGems Environment:
- RUBYGEMS VERSION: 1.8.24
- RUBY VERSION: 1.9.3 (2012-10-12 patchlevel 286) [x86_64-linux]
- INSTALLATION DIRECTORY: /usr/local/ruby-1.9.3-p286/lib/ruby/gems/1.9.1
- RUBY EXECUTABLE: /usr/local/ruby-1.9.3-p286/bin/ruby
- EXECUTABLE DIRECTORY: /usr/local/ruby-1.9.3-p286/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /usr/local/ruby-1.9.3-p286/lib/ruby/gems/1.9.1
- /root/.gem/ruby/1.9.1
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- http://rubygems.org/



以上です。