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