2014-09-15 7 views
0

수정하기 쉬운 문제로 실행되고 있지만 마법을 찾지 못하는 것 같습니다.이전 릴리스 실행 파일 (rbenv + runit)을 사용하는 unicorn

유니콘은 runit을 사용하고 현재 릴리스 Gemfile을 가리키고 있습니다. 각 배포가 끝날 ​​때 유니콘에 USR2 신호가 전송되고 이전 마스터는 "가동 중단 시간 제로"메소드를 사용하여 성공적으로 바뀝니다. 이전 버전이 삭제 된 시점까지는 괜찮 았습니다. Unitorn 마스터를 처음 만들 때 사용 된 릴리스 디렉토리를 가리키는 runit을 발견했습니다.

난 unicorn.rb이 블록을 추가하는 시도 : 또한,이 스크립트 들러 배치 시도

before_exec do |server| 
    ENV['BUNDLE_GEMFILE'] = "/home/deploy/app/current/Gemfile" 
end 

:

#!/bin/bash 

source /etc/profile.d/rbenv.sh 

bundle [email protected] 

는 심지어 시도 수동 BUNDLE_GEMFILE의 ENV 변수 설정, 그러나 이들 중 어느 것도 작동하지 않는 것 같습니다. 내가 배포 한 후 유니콘 표준 출력을 살펴 때

나는이 참조 :

executing ["/home/deploy/app/releases/1279f2e2d88c90ba4e02eaba611a4ee6de6fee77/vendor/bundle/ruby/2.0.0/bin/unicorn", "-E", "staging", "-c", "/home/deploy/app/shared/config/unicorn.rb", "-D", {12=>#<Kgio::UNIXServer:fd 12>}] (in /home/deploy/app/releases/d6a582935d84cc0bec2e760c14d804a7c5e2146c) 

당신이 볼 수 있듯이, 명령이 새로운 릴리즈 디렉토리 (d6a582935d84cc0bec2e760c14d804a7c5e2146c)에서 실행되고 있지만, 유니크론 실행은 이전 릴리스 (1279f2e2d88c90ba4e02eaba611a4ee6de6fee77)를 가리 킵니다.

수동으로 유니콘을 중지/시작하면 올바른 릴리스가 사용되지만 "가동 중지 시간이 적용되지 않음"을 의미하지 않습니다.

문제가 무엇인지 확실하지 않지만 rbenv 경로와 관련이 있다고 생각합니다. 누구나 올바른 (현재) 릴리스를 가리키는 유니콘을 얻는 방법에 대한 제안 사항이 있습니까?

누군가 익숙하다면 요리사와 함께 application_ruby LWRP를 사용하여 배포하고 있습니다. 기본적으로 Capistrano를 에뮬레이트합니다.

관련 CONFIGS :

unicorn.rb :

current_path = '/home/deploy/app/current' 

working_directory '/home/deploy/app/current' 

worker_processes 8 

listen "/home/deploy/app/shared/sockets/cms.sock" 

timeout 60 

pid '/home/deploy/app/shared/pids/unicorn.pid' 

stderr_path '/home/deploy/app/shared/log/unicorn/unicorn.stderr.log' 
stdout_path '/home/deploy/app/shared/log/unicorn/unicorn.stderr.log' 

preload_app true 

# Enable Copy on Write Garbage Collector - http://www.rubyenterpriseedition.com/faq.html#adapt_apps_for_cow 
if GC.respond_to?(:copy_on_write_friendly=) 
    GC.copy_on_write_friendly = true 
end 

before_fork do |server, worker| 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.connection.disconnect! 
    end 

    old_pid = "/home/deploy/app/shared/pids/unicorn.pid.oldbin" 

    if File.exists?(old_pid) && server.pid != old_pid 
    begin 
     sig = (worker.nr + 1) >= server.worker_processes ? :TERM : :TTOU 
     Process.kill(sig, File.read(old_pid).to_i) 
    rescue Errno::ENOENT, Errno::ESRCH 
     # someone else did our job for us 
    end 
    end 
    # sleep 0 for small app, sleep 2 for big (300mb+) 
    sleep 1 
end 

before_exec do |server| 
    ENV['BUNDLE_GEMFILE'] = "#{current_path}/Gemfile" 
end 

after_fork do |server, worker| 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.establish_connection 
    end 
end 

runit 유니콘 스크립트

#!/bin/bash 

if [ -d "/home/deploy/app/current" ] ; then 

    function is_unicorn_alive { 
     set +e 
     if [ -n $1 ] && kill -0 $1 >/dev/null 2>&1; then 
      echo "yes" 
     fi 
     set -e 
    } 

    echo "Service PID: $$" 

    CUR_PID_FILE="/home/deploy/app/shared/pids/unicorn.pid" 
    OLD_PID_FILE=$CUR_PID_FILE.oldbin 

    if [ -e $OLD_PID_FILE ]; then 
     OLD_PID=$(cat $OLD_PID_FILE) 
     echo "Waiting for existing master ($OLD_PID) to exit" 
     while [ -n "$(is_unicorn_alive $OLD_PID)" ]; do 
      /bin/echo -n '.' 
      sleep 2 
     done 
    fi 

    if [ -e $CUR_PID_FILE ]; then 
     CUR_PID=$(cat $CUR_PID_FILE) 
     if [ -n "$(is_unicorn_alive $CUR_PID)" ]; then 
      echo "Unicorn master already running. PID: $CUR_PID" 
      RUNNING=true 
     fi 
    fi 

    if [ ! $RUNNING ]; then 
     echo "Starting unicorn" 
     cd /home/deploy/app/current 
     chown deploy:deploy /home/deploy/app/shared/pids/ 

     chpst -u deploy \ 
     /opt/rbenv/shims/bundle exec \ 
     unicorn \ 
     -E staging -c /home/deploy/app/shared/config/unicorn.rb -D 

     sleep 3 
     CUR_PID=$(cat $CUR_PID_FILE) 
    fi 

    function restart { 
     echo "Initialize new master with USR2" 
     kill -USR2 $CUR_PID 
     # Make runit restart to pick up new unicorn pid 
     sleep 2 
     echo "Restarting service to capture new pid" 
     exit 
    } 

    function graceful_shutdown { 
     echo "Initializing graceful shutdown" 
     kill -QUIT $CUR_PID 
    } 

    function unicorn_interrupted { 
     echo "Unicorn process interrupted. Possibly a runit thing?" 
    } 

    trap restart HUP QUIT USR2 INT 
    trap graceful_shutdown TERM KILL 
    trap unicorn_interrupted ALRM 

    echo "Waiting for current master to die. PID: ($CUR_PID)" 
    while [ -n "$(is_unicorn_alive $CUR_PID)" ]; do 
     /bin/echo -n '.' 
     sleep 2 
    done 
else 
    sleep 1 
fi 

답변

0

그것을 발견!

추가 된이 unicorn.rb합니다 :

유니콘 :: HttpServer에 :: START_CTX [0] = "유니콘 # {CURRENT_PATH}/빈 /"