7 VALID_STATES = [:init, :up, :start, :restart]
11 attr_accessor :grace, :start_grace, :stop_grace, :restart_grace
14 def_delegators :@process, :name, :uid, :gid, :start, :stop, :restart,
15 :name=, :uid=, :gid=, :start=, :stop=, :restart=,
16 :pid_file, :pid_file=, :log, :log=, :alive?, :pid
21 @process = God::Process.new
24 self.valid_states = VALID_STATES
25 self.initial_state = INITIAL_STATE
27 # no grace period by default
28 self.grace = self.start_grace = self.stop_grace = self.restart_grace = 0
32 super && @process.valid?
35 ###########################################################################
39 ###########################################################################
44 b = Behavior.generate(kind, self)
45 rescue NoSuchBehaviorError => e
49 # send to block so config can set attributes
50 yield(b) if block_given?
52 # abort if the Behavior is invalid, the Behavior will have printed
53 # out its own error messages by now
59 ###########################################################################
63 ###########################################################################
66 self.transition(:up, :start) do |on|
72 self.transition(:up, :restart) do |on|
77 ###########################################################################
81 ###########################################################################
85 # start monitoring at the first available of the init or up states
86 if !self.metrics[:init].empty?
93 ###########################################################################
97 ###########################################################################
99 def action(a, c = nil)
102 call_action(c, :start)
103 sleep(self.start_grace + self.grace)
106 call_action(c, :restart)
111 sleep(self.restart_grace + self.grace)
113 call_action(c, :stop)
114 sleep(self.stop_grace + self.grace)
118 def call_action(condition, action)
120 before_items = self.behaviors
121 before_items += [condition] if condition
122 before_items.each do |b|
123 info = b.send("before_#{action}")
125 msg = "#{self.name} before_#{action}: #{info} (#{b.base_name})"
126 applog(self, :info, msg)
132 msg = "#{self.name} #{action}: #{self.send(action).to_s}"
133 applog(self, :info, msg)
136 @process.call_action(action)
139 after_items = self.behaviors
140 after_items += [condition] if condition
141 after_items.each do |b|
142 info = b.send("after_#{action}")
144 msg = "#{self.name} after_#{action}: #{info} (#{b.base_name})"
145 applog(self, :info, msg)
150 ###########################################################################
154 ###########################################################################
157 God.registry.add(@process)
161 God.registry.remove(@process)