2012-08-23 28 views
9

Tôi đang sử dụng EventMachineMonetarily để khởi động máy chủ TCP cùng với ứng dụng đường ray của mình. Điều này được bắt đầu từ config/initializers/momentarily.rb.Phát hiện xem ứng dụng đã được khởi động là máy chủ HTTP hay chưa (tác vụ cào, rconsole, v.v.)

Vấn đề của tôi là nó cũng bắt đầu khi tôi chạy các tác vụ cào, như db:migrate. Tôi chỉ muốn nó bắt đầu khi tôi khởi động máy chủ HTTP. Môi trường sẽ không hữu ích, vì cả hai nhiệm vụ khởi động và cào máy chủ đều nằm trong môi trường phát triển. Có cách nào để biết rằng ứng dụng đang chạy máy chủ HTTP như trái ngược với bất kỳ thứ gì khác không? Lưu ý rằng không chỉ là các tác vụ cào, EM cũng bắt đầu nếu tôi chạy giao diện điều khiển đường ray, điều này không phải là điều mong muốn đối với trường hợp của tôi.

Trả lời

6

Không có cách nào tuyệt vời để làm điều này mà tôi biết. Bạn có thể sao chép phương pháp newrelic 's (đánh dấu discover_dispatcher trong local_environment.rb) mà về cơ bản có một danh sách các công nghệ tự động sử dụng để phát hiện nếu nó đang chạy bên hành khách, mỏng vv

Đối với hành khách nó sẽ kiểm tra

defined?(::PhusionPassenger) 

cho mỏng nó sẽ kiểm tra

if defined?(::Thin) && defined?(::Thin::Server) 
+0

Điều đó thực sự hứa hẹn. Cảm ơn! –

+0

Điều này dường như không hoạt động đối với tôi trong Rails 4 với hành khách. –

+0

Hằng số kiểm tra có vẻ là :: PhusionPassenger bây giờ –

0

Có thể bạn có thể thực hiện một công tắc trong bộ khởi tạo dựa trên ARGV?

Cái gì như:

if ARGV.join(' ').match /something/ 
    # your initializer code here 
end 
+0

nó sẽ phải làm việc trong sản xuất cũng vậy, khi chạy trong Apache –

0

Đừng bắt đầu máy chủ khác từ một initializer. Tạo một daemon trong script/momentarily và khởi động nó từ bên trong ứng dụng của bạn.

+0

tôi vẫn sẽ cần phải biết khi nào khởi chạy trình nền và khi không –

0

Sau khi ứng dụng của bạn khởi chạy, bạn có thể yêu cầu nó xuất hiện để kiểm tra ps. Nếu ps cho thấy máy chủ HTTP đang chạy và máy chủ HTTP đang chạy có cùng pid với ứng dụng của bạn (hãy kiểm tra pid bằng cách kiểm tra $$), sau đó bạn có thể khởi chạy máy chủ TCP.

+0

Nhưng điều này sẽ không hoạt động khi tôi chạy 'rails server'. –

+0

Có, nó sẽ. Khi bạn chạy máy chủ đường ray 'ps aux | grep rayails sẽ chứa một cái gì đó như 'remus 18454 0.0 0.8 2515572 65968 s000 S + 11:10 AM 0: 01.51 /Users/remus/.rvm/rubies/ruby-1.9.3-p125/bin/ruby script/rails server' –

6
unless File.basename($0) == "rake" && ARGV.include?("db:migrate") 
    # you are not in rake db:migrate 
end 
+0

sạch nhất của bẩn. Cảm ơn! –

3

Đặt biến môi trường trong config.ru tập tin, và sử dụng nó bất cứ nơi nào trong mã để phát hiện nếu nó được thực hiện chỉ sử dụng một lệnh rails server.

Ví dụ:

  • File:config.ru

    ENV['server_mode'] = '1' 
    

Và sử dụng nó ở đâu đó như:

  • File:config/environment.rb

    Thread.new { infinite_loop! }.join if ENV['server_mode'] = '1' 
    

tham khảo: Answer

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