2009-04-07 6 views
6

Ok, vì vậy tôi muốn tạo một hành động trong Rails để tự khởi động lại. Tôi đã làm một chút tìm kiếm và tìm thấy:Làm cách nào để khởi động lại Rails từ trong Rails?

http://snippets.dzone.com/posts/show/5002

nào cho thấy 2 lệnh, một để ngăn chặn và một để khởi động lại. Các kills sau:

ps -a|grep "/usr/local/bin/ruby script/server"|grep -v "grep /usr"|cut -d " " -f1|xargs -n 1 kill -KILL $1 

Các tín hiệu HUP không khởi động lại đối với tôi, vì vậy tôi đã cố gắng để mangle lệnh trên (điều chỉnh để các lệnh làm việc tốt với cách tôi đã bắt đầu các máy chủ trong Ubuntu):

ps -eaf|grep "ruby script/server"|grep -v grep|cut -d " " -f3|xargs -n 1 kill -KILL $1;script/server 

này hoạt động tốt trong môi trường của tôi, vì vậy tôi đã cố gắng để thiết lập một hành động để thực hiện nó:

def restart 
    fork { exec "ps -eaf|grep \"ruby script/server\"|grep -v grep|cut -d \" \" -f3|xargs -n 1 kill -KILL $1;script/server" } 
    redirect_to "/server_maintenance" 
end 

hành động giết phạt server, nhưng không thực sự khởi động server lại u p:

=> Booting Mongrel 
=> Rails 2.3.2 application starting on http://0.0.0.0:3000 
=> Call with -d to detach 
=> Ctrl-C to shutdown server 
Exiting 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize_without_backlog': Address already in use - bind(2) (Errno::EADDRINUSE) 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize' 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `new' 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `initialize' 
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `new' 
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `run' 
    from /usr/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/commands/server.rb:111 
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
    from script/server:3 

Tôi không hiểu tại sao địa chỉ này đã được sử dụng khi Mongrel dường như vừa mới thoát.

Tôi tìm thấy câu hỏi này:

How do you restart Rails under Mongrel, without stopping and starting Mongrel

nhưng các tín hiệu không gây khởi động lại trong môi trường của tôi, họ chỉ kết thúc giết chết quá trình này.

Bất kỳ ai có ý tưởng về những gì có thể hoạt động? Đối với một số lưu ý về môi trường của tôi: Tôi đã cài đặt Rails từ phiên bản mới của RubyGems và Mongrel. Tôi sử dụng kịch bản/máy chủ để bắt đầu máy chủ, trong đó tất nhiên sử dụng Mongrel. Tôi đang ở trên Ubuntu Hardy Heron.

Trả lời

3

Ok Tôi tìm thấy một sửa chữa ... Tôi đã thay đổi như thế nào tôi bắt đầu đường ray để:

mongrel_rails start -d 

và bây giờ là hành động sau đây sẽ làm điều đó:

def restart 
    fork { exec "mongrel_rails restart" } 
    redirect_to "/server_maintenance" 
end 

Là một caveat, các redirect_to sẽ gây ra tải không thành công vì máy chủ sẽ ngừng hoạt động ... tuy nhiên việc tải lại sau khi tạm dừng sẽ cho thấy quá trình khởi động lại thành công. Điều này có thể được cố định bằng cách thay đổi khởi động lại để được thực hiện với AJAX, theo sau là một tải lại javascript ... nhưng tôi sẽ để lại đó như là một bài tập cho người đọc.

4

Nếu bạn không ngại chuyển sang mod_rails, bạn có thể khởi động lại máy chủ của mình bằng cách tạo $ RAILS_ROOT/tmp/restart.txt, điều này chỉ gây ra trường hợp Rails bạn quan tâm để khởi động lại.

Lệnh PS của bạn trông (nháy mắt) giống như nó sẽ giết tất cả các quy trình đường ray trên hộp của bạn. Đó là tốt nếu bạn là ứng dụng Rails duy nhất trên một máy tính, nhưng nếu có một vài chạy như cùng một người dùng hoặc bạn đang chạy như root bạn sẽ giết tất cả. Hình thức xấu!

This chỉ ra cho mongrel. Có cách bạn muốn thử.

+0

Cảm ơn bạn đã trả lời! Tôi thực sự đã làm cho nó hoạt động một chút trước khi bạn trả lời, nhưng liên kết khá nhiều cho thấy làm thế nào tôi đã nhận nó làm việc, do đó, sẽ upvote! –

0

Trong tư vấn của chúng tôi với các công ty khởi nghiệp đang chạy trang web của họ trên Rails, chúng tôi đã sử dụng hai phương pháp để quản lý các quy trình mongrel.

Đầu tiên, là một đá quý tùy chỉnh mà chúng tôi đã viết có tên là mongrel_runit. Điều này đặt mongrels lên như các dịch vụ trong runit.

Thứ hai, chúng tôi đã sử dụng god để theo dõi quá trình mongrel. Điều này sẽ làm việc với mongrel_runit hoặc với các cấu hình mong muốn 'bình thường'.

+0

Cảm ơn bạn đã trả lời! Thật không may, điều này không chính xác đáp ứng nhu cầu cá nhân của tôi. Ngoài ra tôi sẽ đề nghị bạn thêm một số thông tin thêm về mongrel_runit cả ở đây và trên trang dự án ... nó không hoàn toàn rõ ràng những gì nó làm. –