2012-05-28 4 views
7

mit Ruby v1.8.7 und Daemons v1.1.8 auf Mac OS X Lion, ich bin versucht, einen Verbraucherprozeß zu schreiben und es als Dameon laufen zu bekommen:Bad File Descriptor in 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 

jedoch es startet nicht und stattdessen wirft einen langen Zurückverfolgungs, die etwas geht:

 
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 

ich bin nicht sicher, was das Problem verursacht? Der Verzeichnisname und der Name der Protokolldatei sind alle gültig. Ich bin in der Lage, eine Instanz von MyConsumer mit diesen Config zu erstellen und in der Lage, seine # Subscribe ordnungsgemäß von einem eigenständigen Programm/Konsole auszuführen.

+3

Nachdem ich einige Erfahrungen mit Ruby Daemons gesammelt habe, bin ich zu der Erkenntnis gelangt, dass ein solcher Fehler impliziert, dass der zugrunde liegende Block (der dämonisiert ist) Fehler enthält. Das Beheben aller Fehler im zugrunde liegenden Block behebt diesen Fehler ebenfalls. –

+0

Ich hatte das gleiche Problem. Danke, dass du deine Erkenntnisse weitergegeben hast! – vpsz

+2

Um anderen zu helfen, beantworten Sie Ihre eigene Frage, so dass sie eine formale Antwort hat. –

Antwort

3

Basierend auf meinen Erfahrungen mit Ruby-Daemons, fand ich, dass solche Fehler anzuzeigen, dass der zugrunde liegende Block (die daemonisierte ist) Fehler enthält. Das Beheben dieser Fehler behebt diesen Fehler ebenfalls.

+0

In meinem Fall war das Problem, dass die Bibliothek, die ich in der Daemon-Schleife aufgerufen habe, standardmäßig zu stdout schrieb, zusätzlich zu dem, was ich ausdrücklich gesagt hatte. Aber ein Daemon hat keine Stdout! Daher wurde die fehlerhafte Dateideskriptor-Ausnahme ausgelöst. –

0

Sie haben Tippfehler in Ihrem Beispiel, die den Fehler verursachen könnten. Prüfen Sie die Rechtschreibung für MyConsumer, mit dem Sie die s umgesetzt und n ...

consumer = MyCosnumer.new(config) 
+0

Danke für den Hinweis auf den Tippfehler. Es könnte hier angekommen sein, während ich die Frage gepostet habe. Bearbeitet und entfernt es von der Frage –

Verwandte Themen