Каков правильный способ создания хорошо зарекомендовавшего себя Unix или Linux-демона в Ruby?
Каково определение хорошо зарекомендовавшего себя демона и как написать такую программу в Ruby?
Каков правильный способ создания хорошо зарекомендовавшего себя Unix или Linux-демона в Ruby?
Каково определение хорошо зарекомендовавшего себя демона и как написать такую программу в Ruby?
В соответствии с расширенным программированием Stevens в главе 13 UNIX Environment, это процедура создания хорошего демона Unix:
setsid
, чтобы создать новый сеанс. Это делает три вещи:
/
, чтобы избежать вмешательства в установку и размонтированиеstdout
, stderr
и stdin
.В настоящее время существует файл для отслеживания PID, который в значительной степени используется сценариями загрузки дистрибутива Linux. Обязательно запишите PID внука, либо возвращаемое значение второй вилки (шаг 3), либо значение getpid()
после шага 3.
Вот реализация Ruby, в основном переведенная из книги, но с двойной вилкой и выписывающей 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
Следуя примеру Джейсона, я написал более полную версию:
https://gist.github.com/1372491/b76b60fb1842bf0507f47869ab19ad50a045b214
Я включил регистрацию в дополнение к двойной вилке и записи файла pid в файл.
Еще одна интересная реализация в Unicorn:
https://github.com/defunkt/unicorn/blob/master/lib/unicorn/launcher.rb