2010-09-10 5 views

Antwort

17

Verwenden Daemonize.rb

require 'daemons' 
Daemons.daemonize 

Sehr einfaches Beispiel: http://github.com/utkarsh2012/backitup/blob/master/backitup.rb

Wie Daemons Juwel installieren:

gem install daemons 
+0

Das ist vielleicht eine blöde Frage, aber wo ist die Datei daemonize.rb? Ist es ein Juwel, gibt es einen Ort im Internet, wo ich es finden kann, ist es die Standardbibliothek, oder was? – agentbanks217

+0

Es ist ein Juwel. Sie installieren und starten es einfach. – zengr

+0

Ok vielen Dank. – agentbanks217

3

Dies ist ein module, um Ihren Code zu dämonisieren. Hier ist eine offshoot, die ein vorhandenes Skript umschließt.

Im Wesentlichen läuft es auf diese nach unten (von Travis Whitton der Daemonize.rb, der erste Link oben, für einige Programm geändert Ich schrieb vor Jahren):

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

Mark, während dies die richtige ist Code für mehr Vanille-Unix-Systeme, und es wird mehr oder weniger arbeiten unter Mac OS X, es ist wirklich nicht das richtige Rezept ... Ich habe keine Rezept Rezept praktisch zur Registrierung eines Ruby-Skript mit Launchd, aber das ist was das OP sollte wahrscheinlich suchen. :-) –

+0

@Kaelin, ausgezeichneter Punkt. Ich hätte die Frage sorgfältiger lesen sollen. Leider mache ich nichts über keine Macs ... – Mark

+0

tolle Erklärung. – zee

27

Rubin 1.9.x hat nun folgend:

Process.daemon 

Setzen Sie es in Ihren Code und das war's.

Aufgenommen von "Daemon Processes in Ruby."

+1

Es funktioniert nicht unter Windows. – Olathe

3

Notwendigkeit, die Dämonen-Schienen gem für Rails 3 (basierend auf rails_generator) zu sehen:

rails generate daemon <name> 

Eigenschaften::

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

Mögliche Daemon Stummel wie diese erzeugen

  • einzelne con trol Skript pro Daemon
  • rake: Daemon Befehl pro Daemon
  • Capistrano freundlich
  • App weite Steuerung Skript
  • Überwachung API
  • möglich, mehrere Daemon setzt
Verwandte Themen