module Adhearsion::CustomDaemonizer

Public Class Methods

daemonize(log_file = '/dev/null') { |pid| ... } click to toggle source

This method causes the current running process to become a daemon

# File lib/adhearsion/foundation/custom_daemonizer.rb, line 22
def self.daemonize(log_file = '/dev/null')
  srand # Split rand streams between spawning and daemonized process

  # Fork, then exit when the child has exited below
  if pid = safefork
    ::Process.wait pid
    exit
  end

  # Detach from the controlling terminal
  raise 'Cannot detach from controlled terminal' unless sess_id = ::Process.setsid

  # Prevent the possibility of acquiring a controlling terminal
  # Fork again, allow a PID file to be written, then exit
  trap 'SIGHUP', 'IGNORE'

  if pid = safefork
    yield pid if block_given?
    exit
  end

  Dir.chdir "/"   # Release old working directory
  File.umask 0000 # Ensure sensible umask

  STDIN.reopen "/dev/null"
  STDOUT.reopen '/dev/null', "a"
  STDERR.reopen log_file, "a"
  return sess_id
end
safefork() click to toggle source

Try to fork if at all possible retrying every 5 sec if the maximum process limit for the system has been reached

# File lib/adhearsion/foundation/custom_daemonizer.rb, line 11
def self.safefork
  begin
    pid = fork
    return pid if pid
  rescue Errno::EWOULDBLOCK
    sleep 5
    retry
  end
end