2012-05-28 18 views
7

Korzystanie Ruby v1.8.7 i demony v1.1.8 w systemie Mac OS X Lion, jestem próby zapisu procesu konsumentów i dostać go uruchomić jako demona:Bad deskryptor pliku w 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 

jednak nie uruchamia a zamiast rzuca długi traceback, który wygląda mniej więcej tak:

 
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 

nie jestem pewien, co jest przyczyną tego problemu? Nazwa katalogu, nazwa pliku dziennika są prawidłowe. Jestem w stanie utworzyć instancję MyConsumer z tymi konfiguracjami i mogę poprawnie wykonać # subskrypcję z autonomicznego programu/konsoli.

+3

Po uzyskaniu pewnego doświadczenia z Ruby Daemons, zdałem sobie sprawę, że każdy taki błąd implikuje, że ukryty blok (który jest demonizowany) zawiera błędy. Naprawienie wszystkich błędów w bloku bazowym również naprawia ten błąd. –

+0

Miałem ten sam problem. Dziękuję za podzielenie się swoimi odkryciami! – vpsz

+2

Aby pomóc innym, odpowiedz na własne pytanie, aby uzyskać formalną odpowiedź. –

Odpowiedz

3

Na podstawie moich doświadczeń z Ruby Daemons, stwierdziliśmy, że takie błędy wskazują, że bazowy blok (który jest daemonized) zawiera błędy. Naprawienie tych błędów również naprawia ten błąd.

+0

W moim przypadku problem polegał na tym, że biblioteka, do której dzwoniłem w daemonizowanej pętli, domyślnie zapisała się na standardowe wyjście, oprócz tego, co wyraźnie powiedziałem. Ale demon nie ma wyjścia! Tak więc podniósł zły wyjątek deskryptora pliku. –

0

W swoim przykładzie występują literówki, które mogą być przyczyną błędu. Sprawdź pisownię dla MyConsumer, której transpozycji S i N ...

consumer = MyCosnumer.new(config) 
+0

Dzięki za wskazanie literówki. Być może przyjechał tutaj, kiedy pisałem pytanie. Edytowałem i usunąłem to z pytania –