Почему блок Ruby Daemons.run_proc был полностью пропущен в Ubuntu 12.04

Мы пытаемся запустить демон с gem daemons на ubuntu 12.04 а также rails 3.2.12 среда для рабочего. Вот этот демон.rb (gem version 1.1.9):

#!/usr/bin/env ruby
require 'daemons'
require 'logger'
  root = Dir.pwd
  Dir.chdir(root)
  file = Dir.pwd + '/ruote_worker.rb' 
  options = {
    :dir_mode   => :normal,
    :dir        => File.join(root, 'amine.log'),
    :log_output => true,
    :backtrace  => true,
    :multiple   => false
  }

  logger = Logger.new('foo.log')
  logger.info('----before daemon----') 

  Daemons.run_proc('ruote_worker', options) do
    # Server loop:
    loop {
      puts '111111111111111'
      logger.info('aaaaaaaaaaaaaaa')
    }
  end

Вот файл foo.log:

# Logfile created on 2013-11-10 12:56:12 -0600 by logger.rb/36483
I, [2013-11-10T12:56:12.594196 #26557]  INFO -- : ----before daemon----

Вот ruote_worker.rb (для тестирования):

#!/usr/bin/env ruby

require 'logger'
logger = Logger.new('amine.log')

loop do
    logger.info('---amine---')
    puts '*****************************************************  Amine ****************************'
    sleep 5
end

Как показывает журнал, Daemons.run_proc() блок был полностью пропущен и не выполнен вообще. Мы попытались Daemons.run_proc() без 'ruote_worker' и Daemons.call() и ни один код внутри блока не был выполнен. Каким-то образом весь блок был пропущен и никогда не выполняется. Может кто-нибудь пролить свет на то, как заставить демона работать? У нас ограниченный опыт работы с гемом ruby ​​daemons (подробности приветствуются). Благодарю.

1 ответ

Решение

Прочитайте http://daemons.rubyforge.org/ чтобы получить хорошее представление о том, как использовать гем демонов. По сути, существует два разных способа создания демона:

  • либо у вас есть сценарий управления, включая Daemons.run_proc вызов, в котором вы реализуете поведение демона
  • или у вас есть сценарий управления, включая Daemons.run вызов, которому вы передаете имя другого скрипта, который содержит реализацию демона

Судя по тому, что у вас уже есть, вы пытались перейти на второй вариант. Следующие работы для меня:

# this is daemon.rb
require 'daemons'
Daemons.run('ruote_worker.rb')


# this is ruote_worker.rb
require 'logger'
logger = Logger.new('amine.log')
loop do
  logger.info('--- amine ---')
  puts '*** amine ***'
  sleep 5
end

Когда вы сейчас вызываете ruby daemon.rb run (или же ruby daemon.rb start) демон запускается и выполняется скрипт в ruote_worker.rb.

Другие вопросы по тегам