util: allow relative paths to be rotated
[unicorn.git] / lib / unicorn / launcher.rb
blob662b6038bd8c406db85e662c0043306dd6b35e0a
1 # -*- encoding: binary -*-
3 $stdout.sync = $stderr.sync = true
4 $stdin.binmode
5 $stdout.binmode
6 $stderr.binmode
8 require 'unicorn'
10 module Unicorn::Launcher
12   # We don't do a lot of standard daemonization stuff:
13   #   * umask is whatever was set by the parent process at startup
14   #     and can be set in config.ru and config_file, so making it
15   #     0000 and potentially exposing sensitive log data can be bad
16   #     policy.
17   #   * don't bother to chdir("/") here since unicorn is designed to
18   #     run inside APP_ROOT.  Unicorn will also re-chdir() to
19   #     the directory it was started in when being re-executed
20   #     to pickup code changes if the original deployment directory
21   #     is a symlink or otherwise got replaced.
22   def self.daemonize!(options)
23     cfg = Unicorn::Configurator
24     $stdin.reopen("/dev/null")
26     # We only start a new process group if we're not being reexecuted
27     # and inheriting file descriptors from our parent
28     unless ENV['UNICORN_FD']
29       # grandparent - reads pipe, exits when master is ready
30       #  \_ parent  - exits immediately ASAP
31       #      \_ unicorn master - writes to pipe when ready
33       rd, wr = IO.pipe
34       grandparent = $$
35       if fork
36         wr.close # grandparent does not write
37       else
38         rd.close # unicorn master does not read
39         Process.setsid
40         exit if fork # parent dies now
41       end
43       if grandparent == $$
44         # this will block until HttpServer#join runs (or it dies)
45         master_pid = (rd.readpartial(16) rescue nil).to_i
46         unless master_pid > 1
47           warn "master failed to start, check stderr log for details"
48           exit!(1)
49         end
50         exit 0
51       else # unicorn master process
52         options[:ready_pipe] = wr
53       end
54     end
55     # $stderr/$stderr can/will be redirected separately in the Unicorn config
56     cfg::DEFAULTS[:stderr_path] ||= "/dev/null"
57     cfg::DEFAULTS[:stdout_path] ||= "/dev/null"
58     cfg::RACKUP[:daemonized] = true
59   end
61 end