processwanker 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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