2011-12-12 43 views
10

Sau đây là liên kết đến tập lệnh init của tôi cho kỳ lân. https://gist.github.com/1466775Khởi động lại/nâng cấp lân không hoạt động

Lệnh khởi động lại chưa bao giờ làm việc cho tôi. Tôi đang sử dụng nâng cấp để khởi động lại kỳ lân sau mỗi lần triển khai. Nhưng bất cứ khi nào có những thay đổi lớn như đá quý mới được thêm vào, nâng cấp sẽ không hoạt động. Gần đây, tôi đã thay thế đá quý hoptoad bằng airbrake và nó phát hiện lỗi 'Airbrake không đổi (NameError)' chưa được khởi tạo. Nhưng khi tôi dừng lại và bắt đầu kỳ lân một lần nữa, nó hoạt động tốt. Vấn đề nằm trong init script hay vấn đề khác của nó?

Cảm ơn.

Trả lời

11

Theo init script của bạn, "/bin/init.d/unicorn khởi động lại" gửi tín hiệu HUP đến quá trình tổng thể lân

------ cắt

restart|reload) 
    sig HUP && echo reloaded OK && exit 0 
    echo >&2 "Couldn't reload, starting '$CMD' instead" 
    su - $USER -c "$CMD" 

---- -cropped

Đây là những gì HUP làm cho quá trình lân:

nạp cấu hình tập tin và duyên dáng khởi động lại tất cả các công nhân. Nếu chỉ thị “preload_app” là false (mặc định), thì người lao động cũng sẽ nhận bất kỳ thay đổi mã ứng dụng nào khi khởi động lại. Nếu “preload_app” là đúng, thì thay đổi mã ứng dụng sẽ không có hiệu lực.

Điều bạn đang tìm kiếm là tín hiệu USR2 mà thông số nâng cấp của bạn về kỳ lân đã thực hiện!

Tín hiệu USR2 thực thi lại nhị phân đang chạy. Một QUIT riêng biệt phải được gửi đến quy trình gốc sau khi trẻ được xác minh để hoạt động.

+0

Trong khi điều này đúng, chúng tôi không thể biết vấn đề của bạn là gì mà không thấy cấu hình lân. Về cơ bản, nếu nó đặt 'preload_app' thành true ở đâu đó, bạn sẽ cần sử dụng lệnh" upgrade "và bạn sẽ cần phải có thêm mã trong cấu hình unicorn của bạn để làm cho nó hoạt động. Google "unicorn zero downtime deploy" nên đưa ra các ví dụ. Nếu bạn không ** đặt 'preload_app',' khởi động lại' của bạn sẽ là tùy chọn đúng, nhưng nó sẽ khởi động lại hoàn toàn máy chủ, khiến nó trở thành offline trong giây lát. – averell

10

Tôi đã có một vấn đề rất giống nhau và cuối cùng found the solution

Tôi đã nhìn qua các bản ghi trước nhưng rõ ràng là thất bại trong việc nhìn thấy các lỗi (Bundler::GemfileNotFound). Hóa ra có những tham chiếu cũ cho các phiên bản trước đó và một khi tệp gem thay đổi, chủ mới âm thầm thất bại. Tail -f đăng nhập kỳ lân của bạn để xem những gì sẽ xảy ra. vấn đề của tôi đã được tất cả cố định theo các liên kết những điều sau đây unicorn.rb tôi

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

[This] (https://github.com/sosedoff/capistrano-unicorn/commit/c1e7a3f2794dd070367d0808ad102a6d20d39cf2) có thể là giải pháp tốt hơn một chút. – Anjan

+0

@anjan Có, rất hay. Tôi không sử dụng đá quý capistrano-unicorn vào lúc này nhưng đó sẽ là một sửa chữa tốt cho những người đang có. – toxaq

2

tôi đã cùng một vấn đề, nhưng tôi đã sử dụng rbenv được cài đặt trên mỗi cơ sở người dùng. Tôi sử dụng này init script

tôi đã tìm ra rằng kể từ khi rbenv tôi cài đặt trên cơ sở cho mỗi người sử dụng tôi cần một chút thay đổi này:

CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production" 

với điều này:

CMD="cd $APP_ROOT; ~/.rbenv/bin/rbenv exec bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production" 

Hy vọng nó sẽ giúp bạn !

P.S. hoặc ai đó khác vì đó là một câu hỏi cũ =)

0

Tôi đã khắc phục vấn đề này bằng cách thay đổi init kỳ lân của tôi.d kịch bản từ

CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E staging" 

này:

CMD="cd $APP_ROOT; BUNDLE_GEMFILE=$APP_ROOT/Gemfile bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E staging" 

Mà dường như để trỏ đến bó gemfile mới trên mỗi bản phát hành mới. Lấy cảm hứng từ this merge request

Các vấn đề liên quan