lib/daemons/daemonize.rb in daemons-1.2.3 vs lib/daemons/daemonize.rb in daemons-1.2.4

- old
+ new

@@ -17,22 +17,22 @@ end end module_function :safefork # Simulate the daemonization process (:ontop mode) - # NOTE: STDOUT and STDERR will not be redirected to the logfile, + # NOTE: $stdout and $stderr will not be redirected to the logfile, # because in :ontop mode, we normally want to see the output def simulate(logfile_name = nil, app_name = nil) $0 = app_name if app_name # Release old working directory Dir.chdir '/' close_io - # Free STDIN and point it to somewhere sensible - begin; STDIN.reopen '/dev/null'; rescue ::Exception; end + # Free $stdin and point it to somewhere sensible + begin; $stdin.reopen '/dev/null'; rescue ::Exception; end # Split rand streams between spawning and daemonized process srand end module_function :simulate @@ -56,11 +56,11 @@ # in the child rd.close # Detach from the controlling terminal - unless sess_id = Process.setsid + unless Process.setsid fail Daemons.RuntimeException.new('cannot detach from controlling terminal') end # Prevent the possibility of acquiring a controlling terminal trap 'SIGHUP', 'IGNORE' @@ -98,11 +98,11 @@ fail Daemons.RuntimeException.new('cannot detach from controlling terminal') end # Prevent the possibility of acquiring a controlling terminal trap 'SIGHUP', 'IGNORE' - exit if pid = safefork + exit if safefork $0 = app_name if app_name # Release old working directory Dir.chdir '/' @@ -118,42 +118,51 @@ end module_function :daemonize def close_io # Make sure all input/output streams are closed - # Part I: close all IO objects (except for STDIN/STDOUT/STDERR) + # Part I: close all IO objects (except for $stdin/$stdout/$stderr) ObjectSpace.each_object(IO) do |io| - unless [STDIN, STDOUT, STDERR].include?(io) + unless [$stdin, $stdout, $stderr].include?(io) io.close rescue nil end end # Make sure all input/output streams are closed - # Part II: close all file decriptors (except for STDIN/STDOUT/STDERR) + # Part II: close all file decriptors (except for $stdin/$stdout/$stderr) 3.upto(8192) do |i| IO.for_fd(i).close rescue nil end end module_function :close_io - # Free STDIN/STDOUT/STDERR file descriptors and + # Free $stdin/$stdout/$stderr file descriptors and # point them somewhere sensible def redirect_io(logfile_name) - begin; STDIN.reopen '/dev/null'; rescue ::Exception; end + begin; $stdin.reopen '/dev/null'; rescue ::Exception; end - if logfile_name + if logfile_name == 'SYSLOG' + # attempt to use syslog via syslogio begin - STDOUT.reopen logfile_name, 'a' - File.chmod(0644, logfile_name) - STDOUT.sync = true + require 'syslogio' + $stdout = ::Daemons::SyslogIO.new($0, :local0, :info, $stdout) + $stderr = ::Daemons::SyslogIO.new($0, :local0, :err, $stderr) + # error out early so we can fallback to null + $stdout.puts "no logfile provided, output redirected to syslog" rescue ::Exception - begin; STDOUT.reopen '/dev/null'; rescue ::Exception; end + # on unsupported platforms simply reopen /dev/null + begin; $stdout.reopen '/dev/null'; rescue ::Exception; end + begin; $stderr.reopen '/dev/null'; rescue ::Exception; end end + elsif logfile_name + $stdout.reopen logfile_name, 'a' + File.chmod(0644, logfile_name) + $stdout.sync = true + begin; $stderr.reopen $stdout; rescue ::Exception; end + $stderr.sync = true else - begin; STDOUT.reopen '/dev/null'; rescue ::Exception; end + begin; $stdout.reopen '/dev/null'; rescue ::Exception; end + begin; $stderr.reopen '/dev/null'; rescue ::Exception; end end - - begin; STDERR.reopen STDOUT; rescue ::Exception; end - STDERR.sync = true end module_function :redirect_io end