processwanker 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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