2010-09-10 93 views

回答

17

使用Daemonize.rb

require 'daemons' 
Daemons.daemonize 

很简单的例子:http://github.com/utkarsh2012/backitup/blob/master/backitup.rb

如何安装守护宝石:

gem install daemons 
+0

这可能是一个愚蠢的问题,但daemonize.rb文件在哪里?它是一颗宝石,在网上我能找到它的地方,它是标准库,还是什么? – agentbanks217 2010-09-10 23:05:24

+0

这是一颗宝石。你只需安装并开始使用它。 – zengr 2010-09-10 23:13:08

+0

好的非常感谢。 – agentbanks217 2010-09-10 23:51:07

3

这是一个module来守护您的代码。这是一个包含现有脚本的offshoot

本质上,它归结为这个(特拉维斯威顿的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 
+0

马克,而这是正确的代码更多的香草Unix系统,它会或多或少的在Mac OS X上工作,这实际上不是正确的配方......我没有一个可以方便地用launchd注册ruby脚本的罐装食谱,但那就是OP可能应该在寻找。 :-) – 2010-09-10 21:52:43

+0

@凯林,优点。我应该更仔细地阅读这个问题。不幸的是,我并不是没有任何关于没有Mac ... – Mark 2010-09-10 21:57:21

+0

伟大的解释。 – zee 2016-10-06 01:29:10

27

的Ruby 1.9.x的已执行以下操作:

Process.daemon 

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

来自“Daemon Processes in Ruby”。

+1

它不适用于Windows。 – Olathe 2013-02-12 17:50:33

3

需要看到后台程序导轨宝石为Rails 3(基于rails_generator):

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

可以生成守护存根这样的:

rails generate daemon <name> 

特点:

  • individual con每个守护特伦脚本
  • 耙:每守护守护命令
  • Capistrano的友好
  • 应用范围的控制脚本
  • 监测API
  • 可能多个后台程序设置