processwanker 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +34 -0
- data/README +11 -0
- data/Rakefile +13 -0
- data/bin/pw +5 -0
- data/lib/config/config.rb +96 -0
- data/lib/config/config_auth.rb +208 -0
- data/lib/config/config_client.rb +75 -0
- data/lib/config/config_client_cluster.rb +66 -0
- data/lib/config/config_client_clusters.rb +62 -0
- data/lib/config/config_client_host.rb +152 -0
- data/lib/config/config_daemon.rb +94 -0
- data/lib/config/config_daemon_service.rb +84 -0
- data/lib/config/config_daemon_service_dependency.rb +59 -0
- data/lib/config/config_daemon_services.rb +89 -0
- data/lib/config/config_hook.rb +40 -0
- data/lib/config/config_node.rb +160 -0
- data/lib/config/config_smtp.rb +103 -0
- data/lib/events.rb +224 -0
- data/lib/log.rb +88 -0
- data/lib/net/net_api.rb +189 -0
- data/lib/net/net_client.rb +107 -0
- data/lib/net/net_connection.rb +167 -0
- data/lib/net/net_server.rb +232 -0
- data/lib/net/net_server_client.rb +84 -0
- data/lib/net/net_util.rb +205 -0
- data/lib/process_util.rb +216 -0
- data/lib/pw_app.rb +557 -0
- data/lib/service.rb +512 -0
- data/lib/service_classes/dummy_service.rb +88 -0
- data/lib/service_classes/pid_service.rb +126 -0
- data/lib/service_classes/process_service.rb +218 -0
- data/lib/service_classes/upstart_service.rb +103 -0
- data/lib/service_mgr.rb +226 -0
- data/lib/util.rb +31 -0
- data/processwanker.gemspec +36 -0
- data.tar.gz.sig +0 -0
- metadata +157 -0
- metadata.gz.sig +0 -0
data/lib/process_util.rb
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
############################################################################
|
2
|
+
#
|
3
|
+
# process_util.rb
|
4
|
+
#
|
5
|
+
# process management utilities
|
6
|
+
#
|
7
|
+
############################################################################
|
8
|
+
|
9
|
+
require 'service_mgr'
|
10
|
+
require 'log'
|
11
|
+
|
12
|
+
module ProcessWanker
|
13
|
+
module ProcessUtil
|
14
|
+
|
15
|
+
############################################################################
|
16
|
+
#
|
17
|
+
#
|
18
|
+
#
|
19
|
+
############################################################################
|
20
|
+
|
21
|
+
ENVIRONMENT_KEY = "PWANKER"
|
22
|
+
@@all_processes={}
|
23
|
+
@@processes={}
|
24
|
+
@@known_hashes={}
|
25
|
+
@@unknown_history={}
|
26
|
+
@@os=`uname -a`.split[0].downcase.to_sym
|
27
|
+
|
28
|
+
############################################################################
|
29
|
+
#
|
30
|
+
#
|
31
|
+
#
|
32
|
+
############################################################################
|
33
|
+
|
34
|
+
def build_known_hashes()
|
35
|
+
# build hash of all known environment hashes
|
36
|
+
@@unknown_history={}
|
37
|
+
@@known_hashes={}
|
38
|
+
ServiceMgr::instance.services_by_name.each do |n,s|
|
39
|
+
next unless(s.respond_to?(:env_hash))
|
40
|
+
@@known_hashes[ s.env_hash ]=s
|
41
|
+
end
|
42
|
+
end
|
43
|
+
module_function :build_known_hashes
|
44
|
+
|
45
|
+
############################################################################
|
46
|
+
#
|
47
|
+
#
|
48
|
+
#
|
49
|
+
############################################################################
|
50
|
+
|
51
|
+
def scan_processes
|
52
|
+
if(@@os == :linux)
|
53
|
+
scan_processes_linux()
|
54
|
+
elsif(@@os == :darwin)
|
55
|
+
scan_processes_osx()
|
56
|
+
else
|
57
|
+
raise "Bad os?"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
module_function :scan_processes
|
61
|
+
|
62
|
+
############################################################################
|
63
|
+
#
|
64
|
+
#
|
65
|
+
#
|
66
|
+
############################################################################
|
67
|
+
|
68
|
+
def scan_processes_linux
|
69
|
+
|
70
|
+
all_procs={}
|
71
|
+
procs={}
|
72
|
+
|
73
|
+
Dir.glob("/proc/*/environ").each do |p|
|
74
|
+
pid=p.split("/")[2].to_i
|
75
|
+
all_procs[pid]=true
|
76
|
+
begin
|
77
|
+
File.read(p).split("\000").each do |env_item|
|
78
|
+
key,value=env_item.split("=")
|
79
|
+
next unless(key == ENVIRONMENT_KEY)
|
80
|
+
procs[value] ||= []
|
81
|
+
procs[value] << pid
|
82
|
+
end
|
83
|
+
rescue Errno::EACCES => e
|
84
|
+
next
|
85
|
+
rescue Errno::ENOENT => e
|
86
|
+
next
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
@@all_processes=all_procs
|
91
|
+
@@processes=procs
|
92
|
+
|
93
|
+
procs
|
94
|
+
end
|
95
|
+
module_function :scan_processes_linux
|
96
|
+
|
97
|
+
############################################################################
|
98
|
+
#
|
99
|
+
#
|
100
|
+
#
|
101
|
+
############################################################################
|
102
|
+
|
103
|
+
def scan_processes_osx
|
104
|
+
all_procs={}
|
105
|
+
procs={}
|
106
|
+
|
107
|
+
`ps axe`.split("\n").each do |l|
|
108
|
+
s=l.split
|
109
|
+
next if(s[0] == "USER")
|
110
|
+
pid=s[0].to_i
|
111
|
+
all_procs[pid]=true
|
112
|
+
(5..(s.length-1)).each do |q|
|
113
|
+
key,value=s[q].split("=")
|
114
|
+
next unless(key == ENVIRONMENT_KEY && value)
|
115
|
+
procs[value] ||= []
|
116
|
+
procs[value] << pid
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
@@all_processes=all_procs
|
121
|
+
@@processes=procs
|
122
|
+
procs
|
123
|
+
end
|
124
|
+
module_function :scan_processes_osx
|
125
|
+
|
126
|
+
############################################################################
|
127
|
+
#
|
128
|
+
#
|
129
|
+
#
|
130
|
+
############################################################################
|
131
|
+
|
132
|
+
def reap
|
133
|
+
begin
|
134
|
+
while(true)
|
135
|
+
break if(!Process::waitpid(-1,Process::WNOHANG))
|
136
|
+
end
|
137
|
+
rescue Exception => e
|
138
|
+
end
|
139
|
+
end
|
140
|
+
module_function :reap
|
141
|
+
|
142
|
+
############################################################################
|
143
|
+
#
|
144
|
+
#
|
145
|
+
#
|
146
|
+
############################################################################
|
147
|
+
|
148
|
+
def processes
|
149
|
+
@@processes
|
150
|
+
end
|
151
|
+
module_function :processes
|
152
|
+
|
153
|
+
############################################################################
|
154
|
+
#
|
155
|
+
#
|
156
|
+
#
|
157
|
+
############################################################################
|
158
|
+
|
159
|
+
def all_processes
|
160
|
+
@@all_processes
|
161
|
+
end
|
162
|
+
module_function :all_processes
|
163
|
+
|
164
|
+
############################################################################
|
165
|
+
#
|
166
|
+
#
|
167
|
+
#
|
168
|
+
############################################################################
|
169
|
+
|
170
|
+
def kill_unknown
|
171
|
+
|
172
|
+
# build list of pids that we ought to kill
|
173
|
+
unknown_pids={}
|
174
|
+
@@processes.each do |p,v|
|
175
|
+
next if(@@known_hashes[p])
|
176
|
+
v.each do |vv|
|
177
|
+
unknown_pids[vv]=true
|
178
|
+
@@unknown_history[vv] ||= { :last_kill_time => Time.at(0), :kcount => 0 }
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# clean out any unknown_history entries that no longer appear
|
183
|
+
@@unknown_history.keys.select { |x| !unknown_pids[x] }.each { |d| @@unknown_history.delete(d) }
|
184
|
+
|
185
|
+
# process entries
|
186
|
+
now=Time.now()
|
187
|
+
@@unknown_history.each do |pid,state|
|
188
|
+
|
189
|
+
elapsed=now - state[:last_kill_time]
|
190
|
+
next if(elapsed < 5)
|
191
|
+
|
192
|
+
mode=(state[:kcount] < 3) ? "TERM" : "KILL"
|
193
|
+
Log::info("kill #{mode} #{pid}")
|
194
|
+
Process.kill(mode,pid)
|
195
|
+
state[:last_kill_time]=now
|
196
|
+
state[:kcount] += 1
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
200
|
+
module_function :kill_unknown
|
201
|
+
|
202
|
+
############################################################################
|
203
|
+
#
|
204
|
+
#
|
205
|
+
#
|
206
|
+
############################################################################
|
207
|
+
|
208
|
+
############################################################################
|
209
|
+
#
|
210
|
+
#
|
211
|
+
#
|
212
|
+
############################################################################
|
213
|
+
|
214
|
+
end
|
215
|
+
|
216
|
+
end
|