2012-05-28 60 views
7

在Mac OS X獅子使用Ruby v1.8.7和後臺進程V1.1.8,我試圖寫一個消費過程,並把它辦成一dameon:錯誤的文件描述符在Ruby中守護

 
# 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 

然而,它不會啓動,而是會拋出長時間的回溯,如下所示:

 
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 

我不確定是什麼原因導致此問題?目錄名稱,日誌文件名都是有效的。我可以用這些配置創建MyConsumer的實例,並且能夠從獨立的程序/控制檯正確執行#subscribe。

+3

因此,在獲得了Ruby守護進程的一些經驗之後,我意識到任何這樣的錯誤都意味着底層塊(被妖魔化)有錯誤。修復底層塊中的所有錯誤也會修復此錯誤。 –

+0

我有同樣的問題。感謝您分享您的發現! – vpsz

+2

爲了幫助他人,請回答你自己的問題,以便它有一個正式的答案。 –

回答

3

根據我使用Ruby守護進程的經驗,我發現這樣的錯誤表示底層塊(這是進程化)包含錯誤。修復這些錯誤也會修復此錯誤。

+0

在我的情況下,問題在於我在默認循環中調用的庫默認情況下會寫入stdout,除了我明確告訴它執行的操作外。但守護進程沒有標準輸出!因此,它引發了錯誤的文件描述符異常。 –

0

在您的示例中確實存在可能導致錯誤的拼寫錯誤。檢查拼寫MyConsumer,你調換了S和N ...

consumer = MyCosnumer.new(config) 
+0

感謝您指出錯字。當我發佈這個問題時,它可能已經到達了這裏。編輯並將其從問題中移除 –

相關問題