使Ruby程序成为一个守护进程?

时间:2010-09-10 21:40:24

标签: ruby daemon

我想编写一个Ruby程序,它将始终在Mac上的后台运行(守护进程)。

有人能指出我如何做到这一点的正确方向吗?

5 个答案:

答案 0 :(得分:27)

Ruby 1.9.x现在有以​​下内容:

Process.daemon

把它放在你的代码中,就是这样。

取自“Daemon Processes in Ruby。”

答案 1 :(得分:18)

使用Daemonize.rb

require 'daemons'
Daemons.daemonize

非常简单的样本:http://github.com/utkarsh2012/backitup/blob/master/backitup.rb

如何安装守护进程gem:

gem install daemons

答案 2 :(得分:4)

啊,谷歌要救了!看看

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

其中一位有用的博主提供了一个编写launchd plist以启动ruby Web应用程序服务器的示例。

答案 3 :(得分:3)

这是一个用于守护代码的module。这是包装现有脚本的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

答案 4 :(得分:3)

需要查看Rails 3的 daemons-rails gem(基于rails_generator):

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

可以像这样生成守护进程存根:

rails generate daemon <name>

特点:

  • 每个守护程序的单独控制脚本
  • rake:每个守护进程的守护进程命令
  • capistrano friendly
  • app-wide控制脚本
  • 监控API
  • 可能的多个守护程序集