Class: Puppet::Daemon Private
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Run periodic actions and a network server in a daemonized process.
A Daemon has 3 parts:
* config reparse
* (optional) an agent that responds to #run
* (optional) a server that response to #stop, #start, and #wait_for_shutdown
The config reparse will occur periodically based on Settings. The server will be started and is expected to manage its own run loop (and so not block the start call). The server will, however, still be waited for by using the #wait_for_shutdown method. The agent is run periodically and a time interval based on Settings. The config reparse will update this time interval when needed.
The Daemon is also responsible for signal handling, starting, stopping, running the agent on demand, and reloading the entire process. It ensures that only one Daemon is running by using a lockfile.
Constant Summary collapse
- SIGNAL_CHECK_INTERVAL =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
5
Instance Attribute Summary collapse
- #agent ⇒ Object private
- #argv ⇒ Object private
- #server ⇒ Object private
- #signals ⇒ Object readonly private
Class Method Summary collapse
-
.close_streams ⇒ Object
private
Close stdin/stdout/stderr so that we can finish our transition into ‘daemon’ mode.
Instance Method Summary collapse
-
#close_streams ⇒ Object
private
Convenience signature for calling Puppet::Daemon.close_streams.
-
#daemonize ⇒ Object
private
Put the daemon into the background.
- #daemonname ⇒ Object private
-
#initialize(pidfile, scheduler = Puppet::Scheduler::Scheduler.new()) ⇒ Daemon
constructor
private
A new instance of Daemon.
- #reexec ⇒ Object private
- #reload ⇒ Object private
- #reopen_logs ⇒ Object private
- #restart ⇒ Object private
-
#set_signal_traps ⇒ Object
private
Trap a couple of the main signals.
- #start ⇒ Object private
-
#stop(args = {:exit => true}) ⇒ Object
private
Stop everything.
Constructor Details
#initialize(pidfile, scheduler = Puppet::Scheduler::Scheduler.new()) ⇒ Daemon
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of Daemon.
29 30 31 32 33 |
# File 'lib/puppet/daemon.rb', line 29 def initialize(pidfile, scheduler = Puppet::Scheduler::Scheduler.new()) @scheduler = scheduler @pidfile = pidfile @signals = [] end |
Instance Attribute Details
#agent ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
26 27 28 |
# File 'lib/puppet/daemon.rb', line 26 def agent @agent end |
#argv ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
26 27 28 |
# File 'lib/puppet/daemon.rb', line 26 def argv @argv end |
#server ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
26 27 28 |
# File 'lib/puppet/daemon.rb', line 26 def server @server end |
#signals ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
27 28 29 |
# File 'lib/puppet/daemon.rb', line 27 def signals @signals end |
Class Method Details
.close_streams ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Close stdin/stdout/stderr so that we can finish our transition into ‘daemon’ mode.
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/puppet/daemon.rb', line 59 def self.close_streams() Puppet.debug("Closing streams for daemon mode") begin $stdin.reopen "/dev/null" $stdout.reopen "/dev/null", "a" $stderr.reopen $stdout Puppet::Util::Log.reopen Puppet.debug("Finished closing streams for daemon mode") rescue => detail Puppet.err "Could not start #{Puppet.run_mode.name}: #{detail}" Puppet::Util::replace_file("/tmp/daemonout", 0644) do |f| f.puts "Could not start #{Puppet.run_mode.name}: #{detail}" end exit(12) end end |
Instance Method Details
#close_streams ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Convenience signature for calling Puppet::Daemon.close_streams
77 78 79 |
# File 'lib/puppet/daemon.rb', line 77 def close_streams() Puppet::Daemon.close_streams end |
#daemonize ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Put the daemon into the background.
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/puppet/daemon.rb', line 40 def daemonize if pid = fork Process.detach(pid) exit(0) end create_pidfile # Get rid of console logging Puppet::Util::Log.close(:console) Process.setsid Dir.chdir("/") close_streams end |
#daemonname ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
35 36 37 |
# File 'lib/puppet/daemon.rb', line 35 def daemonname Puppet.run_mode.name end |
#reexec ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
81 82 83 84 85 86 87 |
# File 'lib/puppet/daemon.rb', line 81 def reexec raise Puppet::DevError, "Cannot reexec unless ARGV arguments are set" unless argv command = $0 + " " + argv.join(" ") Puppet.notice "Restarting with '#{command}'" stop(:exit => false) exec(command) end |
#reload ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
89 90 91 92 93 94 |
# File 'lib/puppet/daemon.rb', line 89 def reload return unless agent agent.run({:splay => false}) rescue Puppet::LockError Puppet.notice "Not triggering already-running agent" end |
#reopen_logs ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
101 102 103 |
# File 'lib/puppet/daemon.rb', line 101 def reopen_logs Puppet::Util::Log.reopen end |
#restart ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
96 97 98 99 |
# File 'lib/puppet/daemon.rb', line 96 def restart Puppet::Application.restart! reexec unless agent and agent.running? end |
#set_signal_traps ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Trap a couple of the main signals. This should probably be handled in a way that anyone else can register callbacks for traps, but, eh.
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/puppet/daemon.rb', line 107 def set_signal_traps [:INT, :TERM].each do |signal| Signal.trap(signal) do Puppet.notice "Caught #{signal}; exiting" stop end end # extended signals not supported under windows if !Puppet.features.microsoft_windows? signals = {:HUP => :restart, :USR1 => :reload, :USR2 => :reopen_logs } signals.each do |signal, method| Signal.trap(signal) do Puppet.notice "Caught #{signal}; storing #{method}" @signals << method end end end end |
#start ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/puppet/daemon.rb', line 140 def start create_pidfile raise Puppet::DevError, "Daemons must have an agent, server, or both" unless agent or server # Start the listening server, if required. server.start if server # Finally, loop forever running events - or, at least, until we exit. run_event_loop server.wait_for_shutdown if server end |
#stop(args = {:exit => true}) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Stop everything
128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/puppet/daemon.rb', line 128 def stop(args = {:exit => true}) Puppet::Application.stop! server.stop if server remove_pidfile Puppet::Util::Log.close_all exit if args[:exit] end |