2012-05-28 26 views
7

Sử dụng Ruby v1.8.7 và v1.1.8 Daemons trên Mac OS X Lion, tôi đang cố gắng để viết một quá trình tiêu dùng và làm cho nó chạy như một dameon:Bad file Descriptor trong Ruby Daemons

 
# config[:name] => 'idx_my_delete_consumer' 
# config[:daemon] => {:multiple => false, 
#     :backtrace => true, 
#     :dir_mode => :normal, 
#     :log_dir => '/Users/pprakash/consumer.log', 
#     :monitor => true, 
#     :dir => '/Users/pprakash/pids'} 

Daemons.run_proc(config[:name], config[:daemon]) do 
    consumer = MyConsumer.new(config) 
    consumer.subscribe 
    end 

Tuy nhiên, nó không bắt đầu và thay vào đó ném một đường mòn dài, giống như sau:

 
E, [2012-05-28T19:34:16.199770 #29357] ERROR -- : Bad file descriptor (Errno::EBADF) 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/daemonize.rb:134:in `for_fd' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/daemonize.rb:134:in `close_io' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/daemonize.rb:134:in `initialize' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/daemonize.rb:134:in `new' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/daemonize.rb:134:in `close_io' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/daemonize.rb:75:in `call_as_daemon' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/application.rb:258:in `start_proc' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/application.rb:295:in `start' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:51:in `watch' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:51:in `fork' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:51:in `watch' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:45:in `each' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:45:in `watch' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:44:in `loop' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:44:in `watch' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:84:in `start_with_pidfile' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:64:in `fork' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:64:in `start_with_pidfile' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/monitor.rb:111:in `start' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/application_group.rb:149:in `create_monitor' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/application.rb:284:in `start' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/controller.rb:70:in `run' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons.rb:197:in `run_proc' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/cmdline.rb:109:in `call' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons/cmdline.rb:109:in `catch_exceptions' 
/opt/local/lib/ruby/gems/1.8/gems/daemons-1.1.8/lib/daemons.rb:196:in `run_proc' 
users/delete_consumer.rb:40 

Tôi không chắc điều gì gây ra vấn đề này? Tên thư mục, tên tệp nhật ký đều hợp lệ. Tôi có thể tạo một thể hiện của MyConsumer với các cấu hình này và có thể thực hiện #subscribe của nó một cách chính xác từ một chương trình/bàn điều khiển độc lập.

+3

Vì vậy, sau khi đạt được một số kinh nghiệm với Ruby Daemons, tôi đã nhận ra rằng bất kỳ lỗi nào ngụ ý rằng khối cơ bản (được demonized) có lỗi. Sửa tất cả các lỗi trong khối cơ bản cũng sửa lỗi này. –

+0

Tôi đã có cùng một vấn đề. Cảm ơn bạn đã chia sẻ phát hiện của mình! – vpsz

+2

Để giúp những người khác, hãy trả lời câu hỏi của riêng bạn để câu trả lời chính thức. –

Trả lời

3

Dựa trên kinh nghiệm của tôi với Ruby Daemons, tôi phát hiện ra rằng các lỗi như vậy cho thấy rằng các khối cơ bản (được daemonized) tài liệu bị lỗi. Việc sửa các lỗi đó cũng sẽ khắc phục lỗi này.

+0

Trong trường hợp của tôi, vấn đề là thư viện mà tôi đã gọi trong vòng lặp daemonized đã viết cho stdout theo mặc định, ngoài những gì tôi đã nói với nó một cách rõ ràng. Nhưng một daemon không có stdout! Vì vậy, nó đã tăng ngoại lệ mô tả tập tin xấu. –

0

Bạn có lỗi chính tả trong ví dụ có thể gây ra lỗi. Kiểm tra chính tả cho MyConsumer, mà bạn hoán s và n ...

consumer = MyCosnumer.new(config) 
+0

Cảm ơn bạn đã trỏ lỗi đánh máy. Nó có thể đã đến đây trong khi tôi đã đăng câu hỏi. Chỉnh sửa và loại bỏ nó khỏi câu hỏi –

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