Ich möchte ein Ruby-Programm schreiben, das immer im Hintergrund (ein Daemon) auf meinem Mac läuft.Machen Sie ein Ruby-Programm zu einem Daemon?
Kann mir jemand in die richtige Richtung zeigen, wie dies geschehen würde?
Ich möchte ein Ruby-Programm schreiben, das immer im Hintergrund (ein Daemon) auf meinem Mac läuft.Machen Sie ein Ruby-Programm zu einem Daemon?
Kann mir jemand in die richtige Richtung zeigen, wie dies geschehen würde?
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
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
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. :-) –
@Kaelin, ausgezeichneter Punkt. Ich hätte die Frage sorgfältiger lesen sollen. Leider mache ich nichts über keine Macs ... – Mark
tolle Erklärung. – zee
Ah, Google zur Rettung! Check out
http://fitzgeraldsteele.wordpress.com/2009/05/04/launchd-example-start-web-server-at-boot-time/
wobei ein hilfreicher Blogger ein Beispiel für das Schreiben eines launchd plist bietet eine rubin Web Application Server zu starten.
Froh, dass Sie dachten, es wäre hilfreich! Ich bin persönlich gekommen, um launchd zu mögen ... für einen kann es Ihren Prozess neu starten, wenn er unerwartet stirbt. – fitzgeraldsteele
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."
Es funktioniert nicht unter Windows. – Olathe
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
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
Es ist ein Juwel. Sie installieren und starten es einfach. – zengr
Ok vielen Dank. – agentbanks217