2012-05-28 27 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

感谢您指出错字。当我发布这个问题时,它可能已经到达了这里。编辑并将其从问题中移除 –

相关问题