def daemonize(logfile_name = nil, app_name = nil)
srand
safefork and exit
unless sess_id = Process.setsid
raise Daemons.RuntimeException.new('cannot detach from controlling terminal')
end
trap 'SIGHUP', 'IGNORE'
exit if pid = safefork
$0 = app_name if app_name
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 sess_id
end