web-dev-qa-db-ja.com

Rubyプログラムをデーモンにしますか?

Macのバックグラウンド(デーモン)で常に実行されるRubyプログラムを作成したいと思います。

誰かがこれがどのように行われるかについて正しい方向に私を向けることができますか?

26
agentbanks217

Daemonize.rbを使用する

require 'daemons'
Daemons.daemonize

非常に単純なサンプル: http://github.com/utkarsh2012/backitup/blob/master/backitup.rb

デーモンgemをインストールする方法:

gem install daemons
18
zengr

Ruby1.9.xには次のものがあります。

Process.daemon

それをあなたのコードに入れてください、そしてそれはそれです。

Rubyのデーモンプロセス 」から取得。

27

ああ、グーグルが救助に!チェックアウト

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

ここで、役立つブロガーは、Ruby Webアプリケーションサーバーを起動するためのlaunchdplistを作成する例を提供します。

4

これは モジュール コードをデーモン化するためのものです。これが offshoot で、既存のスクリプトをラップします。

基本的に、これに要約されます(Travis Whittonの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
3
Mark

Rails 3(Rails_generatorに基づく)のdaemons-Railsgemを確認する必要があります:

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

次のようなデーモンスタブを生成できます。

Rails generate daemon <name>

特徴:

  • デーモンごとの個別の制御スクリプト
  • デーモンごとのrake:daemonコマンド
  • capistranoフレンドリー
  • アプリ全体の制御スクリプト
  • モニタリングAPI
  • 可能な複数のデーモンセット
3
oklas