Quelle est la bonne façon de créer un démon Unix ou Linux bien conçu dans Ruby?Créer un démon à double fourchette dans Ruby
Quelle est la définition d'un démon bien comporté de toute façon, et comment écrire un tel programme dans Ruby?
Quelle est la bonne façon de créer un démon Unix ou Linux bien conçu dans Ruby?Créer un démon à double fourchette dans Ruby
Quelle est la définition d'un démon bien comporté de toute façon, et comment écrire un tel programme dans Ruby?
Selon Programmation avancée de Stevens dans l'environnement UNIX chapitre 13, c'est la procédure pour faire un démon Unix bien comportés:
setsid
pour créer une nouvelle session. Cela fait trois choses:
/
pour ne pas interférer avec le montage et le démontagestdout
, stderr
et stdin
.De nos jours, il existe un fichier pour suivre le PID qui est largement utilisé par les scripts de démarrage de distribution Linux. Assurez-vous d'écrire le PID du petit-enfant, soit la valeur de retour de la seconde fourche (étape 3) ou la valeur de getpid()
après l'étape 3.
Voici une implémentation Ruby, principalement traduit du livre, mais avec la double-fourchette et l'écriture du démon PID.
# Example double-forking Unix daemon initializer.
raise 'Must run as root' if Process.euid != 0
raise 'First fork failed' if (pid = fork) == -1
exit unless pid.nil?
Process.setsid
raise 'Second fork failed' if (pid = fork) == -1
exit unless pid.nil?
puts "Daemon pid: #{Process.pid}" # Or save it somewhere, etc.
Dir.chdir '/'
File.umask 0000
STDIN.reopen '/dev/null'
STDOUT.reopen '/dev/null', 'a'
STDERR.reopen STDOUT
À la suite de la réponse impressionnante de Jason J'ai écrit une application plus complète ici:
https://gist.github.com/1372491/b76b60fb1842bf0507f47869ab19ad50a045b214
J'ai mis en exploitation forestière, en plus de la double fourchette et l'écriture du pid fichier.
Une autre implémentation intéressante est Unicorn:
https://github.com/defunkt/unicorn/blob/master/lib/unicorn/launcher.rb
Ou utilisez http://daemons.rubyforge.org – ephemient
C'est vraiment une excellente explication! Merci beaucoup d'avoir répondu à votre propre question. Pas tout le monde le fait même s'ils ont trouvé une solution à ce problème plus tard. – t6d
De rien! Je suis heureux de contribuer. – JasonSmith