def daemonize(logfile_name = nil, oldmode=0)
srand
safefork and exit
unless sess_id = Process.setsid
raise Daemons.RuntimeException.new('cannot detach from controlling terminal')
end
if oldmode.zero?
trap 'SIGHUP', 'IGNORE'
exit if pid = safefork
end
Dir.chdir "/"
File.umask 0000
ObjectSpace.each_object(IO) do |io|
unless [STDIN, STDOUT, STDERR].include?(io)
begin
unless io.closed?
io.close
end
rescue ::Exception
end
end
end
STDIN.reopen "/dev/null" rescue nil
if logfile_name
begin
STDOUT.reopen logfile_name, "a"
rescue ::Exception
STDOUT.reopen "/dev/null" rescue nil
end
else
STDOUT.reopen "/dev/null" rescue nil
end
STDERR.reopen STDOUT rescue nil
return oldmode ? sess_id : 0
end