forked from mojombo/god
-
Notifications
You must be signed in to change notification settings - Fork 0
/
process_exits.rb
69 lines (59 loc) · 2.04 KB
/
process_exits.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
module God
module Conditions
# Trigger when a process exits.
#
# +pid_file+ is the pid file of the process in question. Automatically
# populated for Watches.
#
# Examples
#
# # Trigger if process exits (from a Watch).
# on.condition(:process_exits)
#
# # Trigger if process exits (non-Watch).
# on.condition(:process_exits) do |c|
# c.pid_file = "/var/run/mongrel.3000.pid"
# end
class ProcessExits < EventCondition
# The String PID file location of the process in question. Automatically
# populated for Watches.
attr_accessor :pid_file
def initialize
self.info = "process exited"
end
def valid?
true
end
def pid
# only read pid once since lazy evaluation can cause bugs due to changing external state
@pid ||= self.pid_file ? File.read(self.pid_file).strip.to_i : self.watch.pid
end
def register
pid = self.pid
begin
EventHandler.register(pid, :proc_exit) do |extra|
formatted_extra = extra.size > 0 ? " #{extra.inspect}" : ""
self.info = "process #{pid} exited#{formatted_extra}"
self.watch.trigger(self)
end
msg = "#{self.watch.name} registered 'proc_exit' event for pid #{pid}"
applog(self.watch, :info, msg)
rescue StandardError
raise EventRegistrationFailedError.new
end
end
def deregister
pid = self.pid
@pid = nil # reset so that @pid will bootstrap itself again as needed
if pid
EventHandler.deregister(pid, :proc_exit)
msg = "#{self.watch.name} deregistered 'proc_exit' event for pid #{pid}"
applog(self.watch, :info, msg)
else
pid_file_location = self.pid_file || self.watch.pid_file
applog(self.watch, :error, "#{self.watch.name} could not deregister: no cached PID or PID file #{pid_file_location} (#{self.base_name})")
end
end
end
end
end