Сделать программу на Ruby демоном? - PullRequest
25 голосов
/ 11 сентября 2010

Я хочу написать программу на Ruby, которая всегда будет работать в фоновом режиме (демон) на моем Mac.

Может ли кто-нибудь указать мне правильное направление, как это будет сделано?

Ответы [ 5 ]

27 голосов
/ 20 мая 2012

Ruby 1.9.x теперь имеет следующее:

Process.daemon

Вставьте это в свой код и все.

Взято из " Процессы демона в Ruby ." "

18 голосов
/ 11 сентября 2010

Использовать Daemonize.rb

require 'daemons'
Daemons.daemonize

Очень простой образец: http://github.com/utkarsh2012/backitup/blob/master/backitup.rb

Как установить гем демонов:

gem install daemons
4 голосов
/ 11 сентября 2010

Ах, Гугл на помощь!Ознакомьтесь с

http://fitzgeraldsteele.wordpress.com/2009/05/04/launchd-example-start-web-server-at-boot-time/

, в котором полезный блоггер предоставляет пример написания листинга launchd для запуска сервера веб-приложений ruby.

3 голосов
/ 04 февраля 2016

Необходимо увидеть гем daemons-rails для Rails 3 (на основе rails_generator):

https://github.com/mirasrael/daemons-rails

Возможно создать демон-заглушку следующим образом:

rails generate daemon <name>

Особенности:

  • индивидуальный сценарий управления для демона
  • rake: команда демона для каждого демона
  • дружественный к капистрано
  • управляющий сценарий всего приложения
  • API мониторинга
  • возможные множественные наборы демонов
3 голосов
/ 11 сентября 2010

Это модуль для демонизации вашего кода.Вот ответвление , которое оборачивает существующий скрипт.

По сути, это сводится к этому (из первой ссылки выше Travis Whitton's Daemonize.rb, модифицированной для некоторой программы, которую я написал много лет назад):

private
# This method causes the current running process to become a daemon
# If closefd is true, all existing file descriptors are closed
def daemonize(pathStdErr, oldmode=0, closefd=false)
    srand # Split rand streams between spawning and daemonized process
    safefork and exit# Fork and exit from the parent

    # Detach from the controlling terminal
    unless sess_id = Process.setsid
        raise 'Cannot detach from controlled terminal'
    end

    # Prevent the possibility of acquiring a controlling terminal
    if oldmode.zero?
        trap 'SIGHUP', 'IGNORE'
        exit if pid = safefork
    end

    Dir.chdir "/"   # Release old working directory
    File.umask 0000 # Insure sensible umask

    if closefd
        # Make sure all file descriptors are closed
        ObjectSpace.each_object(IO) do |io|
            unless [STDIN, STDOUT, STDERR].include?(io)
                io.close rescue nil
            end
        end
    end

    STDIN.reopen "/dev/null"       # Free file descriptors and
    STDOUT.reopen "/dev/null"   # point them somewhere sensible
    STDERR.reopen pathStdErr, "w"           # STDOUT/STDERR should go to a logfile
    return oldmode ? sess_id : 0   # Return value is mostly irrelevant
end

# Try to fork if at all possible retrying every 5 sec if the
# maximum process limit for the system has been reached
def safefork
    tryagain = true
    while tryagain
        tryagain = false
        begin
            if pid = fork
                return pid
            end
        rescue Errno::EWOULDBLOCK
            sleep 5
            tryagain = true
        end
    end
end
...