nysol 3.0.1

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,359 @@
1
+ #!/usr/bin/env ruby
2
+ #/* ////////// LICENSE INFO ////////////////////
3
+ #
4
+ # * Copyright (C) 2013 by NYSOL CORPORATION
5
+ # *
6
+ # * Unless you have received this program directly from NYSOL pursuant
7
+ # * to the terms of a commercial license agreement with NYSOL, then
8
+ # * this program is licensed to you under the terms of the GNU Affero General
9
+ # * Public License (AGPL) as published by the Free Software Foundation,
10
+ # * either version 3 of the License, or (at your option) any later version.
11
+ # *
12
+ # * This program is distributed in the hope that it will be useful, but
13
+ # * WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF
14
+ # * NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
15
+ # *
16
+ # * Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
17
+ # * for more details.
18
+ #
19
+ # ////////// LICENSE INFO ////////////////////*/
20
+ require "nysol/mtemp"
21
+ require "nysol/mnettools"
22
+ require "nysol/mrubyparse"
23
+ require "nysol/mparallelmanager"
24
+ $FtpUSE=true
25
+
26
+ class Array
27
+
28
+ # データ収集
29
+ # fn 集めるファイル名 out 出力先 nFlg:項目名無しFLG
30
+ # outの最後が"/"でない場合は1ファイルと見なす
31
+ # 配列にはデータがあるip,pathとが含まれている
32
+ # [ [ip1,path1],[ip2,path2] ...,[ipn,pathn]]
33
+ # データ量によっては端末ごとにcat&圧縮した方が高速化できるかも
34
+ def mcollect(fn,out,nFlg=false,pclist="/etc/pclist")
35
+ fn = [fn] if fn.class != Array
36
+ out = [out] if out.class != Array
37
+ raise "no match size in-out " if fn.size != out.size
38
+
39
+ temp=MCMD::Mtemp.new
40
+ params=self.dup
41
+
42
+ # PC_LIST読み込み
43
+ pcM = MCMD::MpcManager.new(pclist)
44
+
45
+ # ip毎に配列集約
46
+ dlist ={}
47
+ params.each{|ip,path|
48
+ raise "unknown ip " unless pcM.has_IP?(ip)
49
+ dlist[ip] = [] unless dlist.has_key?(ip)
50
+ dlist[ip] << path
51
+ }
52
+
53
+ (0...fn.size).each{|i|
54
+ type = out[i] =~ /\/\s*$/ ? 0 : 2
55
+ type += 1 if dlist.size != 0
56
+
57
+ #パラメータセット
58
+ nfr = "/#{fn[i]}"
59
+ nrev = out[i]
60
+ lcin = fn[i]
61
+ to = out[i]
62
+ if type == 3 then
63
+ nrev = "#{temp.file}/"
64
+ lcin = "#{nrev}*"
65
+ end
66
+
67
+ # collet
68
+ dlist.each{|ip,path|
69
+ MCMD::NetTools.recv(ip,pcM.getUIDbyIP(ip),path.maddSuffix(nfr),nrev,pcM.getPWDbyIP(ip))
70
+ }
71
+ case type
72
+ when 0 #出力ディレクトリ(local)
73
+ MCMD::mkDir(to,true)
74
+ system "cp #{lcin} #{to}"
75
+ when 2,3 #出力ファイル (local)
76
+ if nFlg then
77
+ system "mcat i=#{lcin} o=#{to} -nfn"
78
+ else
79
+ system "mcat i=#{lcin} o=#{to}"
80
+ end
81
+ end
82
+ }
83
+ end
84
+
85
+ # 並列処理each
86
+ def meach(mpCount=4,msgcnt=100,tF=false,&block)
87
+ tim = tF ? 5 : -1
88
+ params=self.dup
89
+ ttl = params.size
90
+ nowcnt = 0
91
+ mpm = MCMD::MparallelManager.new(mpCount,tim)
92
+ mpm.runStateCheker
93
+
94
+ while params.size>0
95
+ param=params.delete_at(0)
96
+ nowlane = mpm.getLane
97
+ # blockの実行
98
+ pid=fork {
99
+ case block.arity
100
+ when 1
101
+ yield(param)
102
+ when 2
103
+ yield(param,nowcnt)
104
+ when 3
105
+ yield(param,nowcnt,nowlane)
106
+ else
107
+ raise "unmatch args size."
108
+ end
109
+ }
110
+ nowcnt+=1
111
+ MCMD::msgLog("meach start #{param} (#{nowcnt}/#{ttl})") if msgcnt!=0 and nowcnt%msgcnt == 0
112
+ mpm.addPid(pid,nowlane)
113
+ end
114
+ mpm.waitall
115
+ return []
116
+ end
117
+
118
+ def meachc(mpInfo=[4,4],msgcnt=100,pclist="/etc/pclist",bg=true,&block)
119
+ # -----------------------------------------------------
120
+ # pc情報設定 & 並列数決定
121
+ # -----------------------------------------------------
122
+ pcM = MCMD::MpcManager.new(pclist)
123
+ mpPC = mpLim = 4
124
+ if mpInfo.class == Array then
125
+ mpPC = mpInfo[0] if mpInfo[0]
126
+ mpLim = mpInfo[1] if mpInfo[1]
127
+ else
128
+ mpPC = mpInfo
129
+ end
130
+ mpPC = pcM.pcCount if mpPC > pcM.pcCount
131
+ mpMax = mpPC * mpLim
132
+
133
+ # -----------------------------------------------------
134
+ # 呼び出し元ファイル & ローカル変数取得
135
+ # -----------------------------------------------------
136
+ fn ,lin = block.source_location
137
+ value = block.binding.eval("local_variables")
138
+ valueV=[]
139
+ value.each{|v|
140
+ clsinfo = block.binding.eval("#{v}.class")
141
+ case clsinfo.to_s
142
+ when "String"
143
+ valinfo = block.binding.eval("#{v}")
144
+ valueV << "#{v} = \"#{valinfo}\""
145
+ when "Fixnum","Bignum","Float"
146
+ valinfo = block.binding.eval("#{v}")
147
+ valueV << "#{v} = #{valinfo}"
148
+ when "Array"
149
+ valinfo = block.binding.eval("#{v}")
150
+ valueV << "#{v} = #{valinfo}"
151
+ end
152
+ }
153
+
154
+ # -----------------------------------------------------
155
+ # 並列用プログラム生成
156
+ # -----------------------------------------------------
157
+ tempC=MCMD::Mtemp.new
158
+ runspf=tempC.file
159
+ MCMD::MrubyParse.new(fn,lin,"meachc",valueV).output(runspf)
160
+
161
+ # -----------------------------------------------------
162
+ # 作業ディレクトリ決定
163
+ # -----------------------------------------------------
164
+ local_WkD = tempC.file
165
+ net_WkD = tempC.file
166
+ MCMD::mkDir(local_WkD)
167
+
168
+ # -----------------------------------------------------
169
+ # 並列処理
170
+ # -----------------------------------------------------
171
+ params=self.dup
172
+ mpm = MCMD::MparallelManagerByFile.new(mpMax,local_WkD)
173
+ ttl = params.size
174
+ nowcnt = 0
175
+ rtnlist =[]
176
+
177
+ while params.size>0
178
+
179
+ param=params.delete_at(0)
180
+ nowlane = mpm.getLane
181
+
182
+ # blockの実行
183
+ pid=fork {
184
+
185
+ stNo = nowlane%mpPC
186
+ param = [param] if param.class != Array
187
+ # -----------------------------------------------------
188
+ # 起動スクリプト生成
189
+ # -----------------------------------------------------
190
+ runinit_Scp = "#{local_WkD}/#{File.basename(runspf)}_#{nowlane}.sh"
191
+ net_nowwkD = "#{net_WkD}/#{nowcnt}"
192
+ File.open(runinit_Scp,"w"){|fpw|
193
+ fpw.puts "cd #{net_nowwkD}"
194
+ case block.arity
195
+ when 1
196
+ fpw.puts "ruby #{File.basename(runspf)} #{param.join(",")}"
197
+ when 2
198
+ fpw.puts "ruby #{File.basename(runspf)} #{param.join(",")} #{nowcnt}"
199
+ when 3
200
+ fpw.puts "ruby #{File.basename(runspf)} #{param.join(",")} #{nowcnt} #{nowlane}"
201
+ else
202
+ raise "unmatch args size."
203
+ end
204
+ fpw.puts "echo pgmend #{nowcnt} >> #{net_nowwkD}/endlog"
205
+ fpw.puts "ls -lR >> #{net_nowwkD}/endlog"
206
+ fpw.puts "msend.rb i=#{net_nowwkD}/endlog uid=#{pcM.getUID(stNo)} o=#{pcM.localIP}:#{local_WkD}/#{nowlane}.log"
207
+ }
208
+
209
+ # -----------------------------------------------------
210
+ # スクリプトファイル&データ転送
211
+ # -----------------------------------------------------
212
+ MCMD::msgLog("meachc snddata #{fn}:#{lin} (#{nowcnt}/#{ttl})") if msgcnt!=0 and nowcnt%msgcnt == 0
213
+ distSrc = "#{net_nowwkD}/#{File.basename(runspf)}"
214
+ distSrcI = "#{net_nowwkD}/#{File.basename(runspf)}.sh"
215
+ MCMD::NetTools.send(pcM.getIP(stNo),pcM.getUID(stNo),runinit_Scp,distSrcI,pcM.getPWD(stNo))
216
+ MCMD::NetTools.send(pcM.getIP(stNo),pcM.getUID(stNo),runspf ,distSrc ,pcM.getPWD(stNo))
217
+ param.each{|dt|
218
+ MCMD::NetTools.send(pcM.getIP(stNo),pcM.getUID(stNo),dt,"#{net_nowwkD}/#{dt}",pcM.getPWD(stNo))
219
+ }
220
+
221
+ # -----------------------------------------------------
222
+ # プログラム実行
223
+ # -----------------------------------------------------
224
+ MCMD::msgLog("meachc pgmstart #{fn}:#{lin} (#{nowcnt}/#{ttl})") if msgcnt!=0 and nowcnt%msgcnt == 0
225
+ MCMD::NetTools.cmdRun(pcM.getIP(stNo),pcM.getUID(stNo),"nohup bash #{distSrcI} 1> #{net_nowwkD}/RunLog 2>&1 &")
226
+ }
227
+ rtnlist << [ pcM.getIP(nowlane%mpPC),"#{net_WkD}/#{nowcnt}" ]
228
+ mpm.addNo(nowcnt,nowlane)
229
+ nowcnt+=1
230
+ Process.detach(pid)
231
+
232
+ end
233
+ mpm.waitall
234
+ return rtnlist
235
+ end
236
+
237
+
238
+ def meachcN(mpInfo=[4,4],msgcnt=100,pclist="/etc/pclist",bg=true,&block)
239
+ # -----------------------------------------------------
240
+ # pc情報設定 & 並列数決定
241
+ # -----------------------------------------------------
242
+ pcM = MCMD::MpcManager.new(pclist)
243
+ mpPC = mpLim = 4
244
+ if mpInfo.class == Array then
245
+ mpPC = mpInfo[0] if mpInfo[0]
246
+ mpLim = mpInfo[1] if mpInfo[1]
247
+ else
248
+ mpPC = mpInfo
249
+ end
250
+ mpPC = pcM.pcCount if mpPC > pcM.pcCount
251
+ mpMax = mpPC * mpLim
252
+
253
+ # -----------------------------------------------------
254
+ # 呼び出し元ファイル & ローカル変数取得
255
+ # -----------------------------------------------------
256
+ fn ,lin = block.source_location
257
+ value = block.binding.eval("local_variables")
258
+ valueV=[]
259
+ value.each{|v|
260
+ clsinfo = block.binding.eval("#{v}.class")
261
+ case clsinfo.to_s
262
+ when "String"
263
+ valinfo = block.binding.eval("#{v}")
264
+ valueV << "#{v} = \"#{valinfo}\""
265
+ when "Fixnum","Bignum","Float"
266
+ valinfo = block.binding.eval("#{v}")
267
+ valueV << "#{v} = #{valinfo}"
268
+ when "Array"
269
+ valinfo = block.binding.eval("#{v}")
270
+ valueV << "#{v} = #{valinfo}"
271
+ end
272
+ }
273
+
274
+ # -----------------------------------------------------
275
+ # 並列用プログラム生成
276
+ # -----------------------------------------------------
277
+ tempC=MCMD::Mtemp.new
278
+ runspf=tempC.file
279
+ MCMD::MrubyParse.new(fn,lin,"meachcN",valueV).output(runspf)
280
+
281
+ # -----------------------------------------------------
282
+ # 作業ディレクトリ決定
283
+ # -----------------------------------------------------
284
+ local_WkD = tempC.file
285
+ net_WkD = tempC.file
286
+ net_HMD = ENV['PWD'].sub(/#{ENV['HOME']}\//,"")
287
+ MCMD::mkDir(local_WkD)
288
+
289
+ # -----------------------------------------------------
290
+ # 並列処理
291
+ # -----------------------------------------------------
292
+ params=self.dup
293
+ mpm = MCMD::MparallelManagerByFile.new(mpMax,local_WkD)
294
+ ttl = params.size
295
+ nowcnt = 0
296
+ rtnlist =[]
297
+
298
+ while params.size>0
299
+
300
+ param=params.delete_at(0)
301
+ nowlane = mpm.getLane
302
+
303
+ # blockの実行
304
+ pid=fork {
305
+
306
+ stNo = nowlane%mpPC
307
+ param = [param] if param.class != Array
308
+ # -----------------------------------------------------
309
+ # 起動スクリプト生成
310
+ # -----------------------------------------------------
311
+ runinit_Scp = "#{local_WkD}/#{File.basename(runspf)}_#{nowlane}.sh"
312
+ net_nowwkD = "#{net_WkD}/#{nowcnt}"
313
+ distSrc = "#{net_nowwkD}/#{File.basename(runspf)}"
314
+ distSrcI = "#{net_nowwkD}/#{File.basename(runspf)}.sh"
315
+
316
+
317
+ File.open(runinit_Scp,"w"){|fpw|
318
+ fpw.puts "mkdir -p #{net_HMD}"
319
+ fpw.puts "cd #{net_HMD}"
320
+ case block.arity
321
+ when 1
322
+ fpw.puts "ruby #{distSrc} #{param.join(",")}"
323
+ when 2
324
+ fpw.puts "ruby #{distSrc} #{param.join(",")} #{nowcnt}"
325
+ when 3
326
+ fpw.puts "ruby #{distSrc} #{param.join(",")} #{nowcnt} #{nowlane}"
327
+ else
328
+ raise "unmatch args size."
329
+ end
330
+ fpw.puts "echo pgmend #{nowcnt} >> #{net_nowwkD}/endlog"
331
+ fpw.puts "ls -lR >> #{net_nowwkD}/endlog"
332
+ fpw.puts "msend.rb i=#{net_nowwkD}/endlog uid=#{pcM.getUID(stNo)} o=#{pcM.localIP}:#{local_WkD}/#{nowlane}.log"
333
+ }
334
+
335
+ # -----------------------------------------------------
336
+ # スクリプトファイル&データ転送
337
+ # -----------------------------------------------------
338
+ MCMD::msgLog("meachcN snddata #{fn}:#{lin} (#{nowcnt}/#{ttl})") if msgcnt!=0 and nowcnt%msgcnt == 0
339
+ MCMD::NetTools.send(pcM.getIP(stNo),pcM.getUID(stNo),runinit_Scp,distSrcI,pcM.getPWD(stNo))
340
+ MCMD::NetTools.send(pcM.getIP(stNo),pcM.getUID(stNo),runspf ,distSrc ,pcM.getPWD(stNo))
341
+
342
+ # -----------------------------------------------------
343
+ # プログラム実行
344
+ # -----------------------------------------------------
345
+ MCMD::msgLog("meachcN pgmstart #{fn}:#{lin} (#{nowcnt}/#{ttl})") if msgcnt!=0 and nowcnt%msgcnt == 0
346
+ MCMD::NetTools.cmdRun(pcM.getIP(stNo),pcM.getUID(stNo),"nohup bash #{distSrcI} 1> #{net_nowwkD}/RunLog 2>&1 &")
347
+ }
348
+ rtnlist << [ pcM.getIP(nowlane%mpPC),"#{net_WkD}/#{nowcnt}" ]
349
+ mpm.addNo(nowcnt,nowlane)
350
+ nowcnt+=1
351
+ Process.detach(pid)
352
+
353
+ end
354
+ mpm.waitall
355
+ return rtnlist
356
+ end
357
+
358
+
359
+ end
@@ -0,0 +1,300 @@
1
+ #!/usr/bin/env ruby
2
+ #/* ////////// LICENSE INFO ////////////////////
3
+ #
4
+ # * Copyright (C) 2013 by NYSOL CORPORATION
5
+ # *
6
+ # * Unless you have received this program directly from NYSOL pursuant
7
+ # * to the terms of a commercial license agreement with NYSOL, then
8
+ # * this program is licensed to you under the terms of the GNU Affero General
9
+ # * Public License (AGPL) as published by the Free Software Foundation,
10
+ # * either version 3 of the License, or (at your option) any later version.
11
+ # *
12
+ # * This program is distributed in the hope that it will be useful, but
13
+ # * WITHOUT ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF
14
+ # * NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
15
+ # *
16
+ # * Please refer to the AGPL (http://www.gnu.org/licenses/agpl-3.0.txt)
17
+ # * for more details.
18
+ #
19
+ # ////////// LICENSE INFO ////////////////////*/
20
+ require "nysol/msysteminfo"
21
+ module MCMD
22
+
23
+ class MpcManager
24
+ def initialize(fn="/etc/pclist")
25
+ @localIP = MCMD::SysInfo.getMyIP
26
+ @pcIP = []
27
+ @pcUID = []
28
+ @pcPWD = []
29
+ @ip2No = {}
30
+ File.open(fn){|fp|
31
+ while lin = fp.gets do
32
+ next if lin =~ /^#/
33
+ lins = lin.chomp.split
34
+ @pcIP << lins[1]
35
+ @pcUID << lins[0]
36
+ @pcPWD << lins[2]
37
+ @ip2No[lins[1]] = @pcIP.size-1
38
+ end
39
+ }
40
+ end
41
+ def each
42
+ (0...@pcIP.size).each{|i|
43
+ yield @pcIP[i],@pcUID[i],@pcPWD[i]
44
+ }
45
+ end
46
+
47
+
48
+ def pcCount
49
+ return @pcIP.size
50
+ end
51
+ def getIP(no)
52
+ return @pcIP[no]
53
+ end
54
+ def getUID(no)
55
+ return @pcUID[no]
56
+ end
57
+ def getPWD(no)
58
+ return @pcPWD[no]
59
+ end
60
+ def has_IP?(ip)
61
+ return @ip2No.has_key?(ip)
62
+ end
63
+
64
+ def getUIDbyIP(ip)
65
+ return nil unless @ip2No.has_key?(ip)
66
+ return getUID(@ip2No[ip])
67
+ end
68
+ def getPWDbyIP(ip)
69
+ return nil unless @ip2No.has_key?(ip)
70
+ return getPWD(@ip2No[ip])
71
+ end
72
+
73
+
74
+ attr_reader :localIP
75
+
76
+
77
+ end
78
+
79
+
80
+ class MparallelManager
81
+
82
+ def initialize(mp=4,tim=-1)
83
+ @mp = mp # パラレルサイズ
84
+ @thInterval = tim # チェック間隔
85
+ @runpid = {} # pid => laneNo ## 動いてるPROCESS
86
+ @slppid = [] # [ [pid ,laneNo child pid] ... ## 休止中PROCESS
87
+ @mtx = Mutex.new if @thInterval > 0
88
+ @LaneQue = Array.new(mp){|i| i }
89
+ end
90
+
91
+ def emptyLQ?
92
+ @LaneQue.empty?
93
+ end
94
+
95
+ # プロセス終了確認
96
+ def waitLane
97
+ finLane =[]
98
+ loop{
99
+ begin
100
+ rpid = nil
101
+ sts = nil
102
+ loop{
103
+ @runpid.each{|k,v|
104
+ rpid ,sts = Process.waitpid2(k,Process::WNOHANG)
105
+ break unless rpid == nil
106
+ }
107
+ break unless rpid == nil
108
+ }
109
+ rescue
110
+ if @mtx then
111
+ @mtx.synchronize {
112
+ @runpid.each{|k,v|
113
+ finLane.push(v)
114
+ @LaneQue.push(v)
115
+ }
116
+ @runpid.clear
117
+ }
118
+ else
119
+ @runpid.each{|k,v|
120
+ finLane.push(v)
121
+ @LaneQue.push(v)
122
+ }
123
+ @runpid.clear
124
+ end
125
+ break
126
+ end
127
+ new_pno = nil
128
+ if @mtx then
129
+ @mtx.synchronize {
130
+ new_pno = @runpid.delete(rpid)
131
+ }
132
+ else
133
+ new_pno = @runpid.delete(rpid)
134
+ end
135
+ if new_pno != nil then
136
+ finLane.push(new_pno)
137
+ @LaneQue.push(new_pno)
138
+ break
139
+ end
140
+ }
141
+ return finLane
142
+ end
143
+
144
+ # 全プロセス終了確認
145
+ def waitall
146
+ rtn = []
147
+ while !@runpid.empty? or !@slppid.empty? do
148
+ rtn.concat(waitLane)
149
+ end
150
+ return rtn
151
+ end
152
+
153
+ # 空き実行レーン取得
154
+ def getLane(wait=true)
155
+ waitLane if wait and @LaneQue.empty?
156
+ return @LaneQue.shift
157
+ end
158
+
159
+ # 実行PID=>lane登録
160
+ def addPid(pid,lane)
161
+ if @mtx then
162
+ @mtx.synchronize { @runpid[pid]=lane }
163
+ else
164
+ @runpid[pid]=lane
165
+ end
166
+ end
167
+
168
+ ## メモリ,CPUチェッカー
169
+ def runStateCheker
170
+ return unless @mtx
171
+ Thread.new {
172
+ begin
173
+ loop{
174
+ if MCMD::SysInfo.LimitOver_Mem_Cpu? then
175
+ @mtx.synchronize {
176
+ if @runpid.size > 1 then
177
+ pid = @runpid.keys[0]
178
+ plist = MCMD::SysInfo.cPIDs(pid)
179
+ stopL = []
180
+ plist.reverse_each{|px|
181
+ begin
182
+ Process.kill(:STOP, px)
183
+ stopL << px
184
+ rescue => msg #STOP できなくてもスルー
185
+ puts "already finish #{px}"
186
+ next
187
+ end
188
+ }
189
+ unless stopL.empty? then
190
+ pno = @runpid.delete(pid)
191
+ @slppid << [pid,pno,stopL]
192
+ end
193
+ else
194
+ unless @slppid.empty? then
195
+ pid,pno,plist = @slppid.shift
196
+ plist.each{|px|
197
+ begin
198
+ Process.kill(:CONT, px)
199
+ rescue => msg
200
+ puts "already finish #{px}"
201
+ end
202
+ }
203
+ @runpid[pid]=pno
204
+ end
205
+ end
206
+ }
207
+ else
208
+ @mtx.synchronize {
209
+ unless @slppid.empty? then
210
+ pid,pno,plist = @slppid.shift
211
+ plist.each{|px|
212
+ begin
213
+ Process.kill(:CONT, px)
214
+ rescue => msg
215
+ puts "already finish #{px}"
216
+ end
217
+ }
218
+ @runpid[pid]=pno
219
+ end
220
+ }
221
+ end
222
+ sleep @thInterval
223
+ }
224
+ rescue => msg
225
+ p msg
226
+ exit
227
+ end
228
+ }
229
+ end
230
+ end
231
+
232
+ class MparallelManagerByFile < MparallelManager
233
+ def initialize(mp=16,wrk="./",tim=-1)
234
+ super(mp,tim)
235
+ @wrk =wrk
236
+ end
237
+
238
+
239
+ # ファイルでプロセス終了確認
240
+ def waitLane
241
+ finLane =[]
242
+ loop{
243
+ bFlg = false
244
+ # @runpid [No->lane]]
245
+ @runpid.each{|k,v|
246
+ next unless File.exist?("#{@wrk}/#{v}.log")
247
+ jmpF =false
248
+ File.open("#{@wrk}/#{v}.log"){|fp|
249
+ lin=fp.gets
250
+ if lin == nil then
251
+ MCMD::msgLog("UNMATCH FORMAT LOG #{@wrk}/#{v}.log")
252
+ jmpF = true
253
+ elsif lin.split[1].to_i != k then
254
+ MCMD::msgLog("UNMATCH NUMBER #{@wrk}/#{v}.log #{k}")
255
+ jmpF = true
256
+ end
257
+ }
258
+ next if jmpF
259
+ finLane.push(v)
260
+ @LaneQue.push(v)
261
+ if @runpid.delete(k) == nil then
262
+ MCMD::msgLog("NIL FIND NIL FIND")
263
+ end
264
+ File.unlink("#{@wrk}/#{v}.log")
265
+ bFlg = true
266
+ }
267
+ break if bFlg
268
+ }
269
+ return finLane
270
+ end
271
+
272
+ def addNo (no,lane)
273
+ if @mtx then
274
+ @mtx.synchronize { @runpid[no]=lane }
275
+ else
276
+ @runpid[no]=lane
277
+ end
278
+ end
279
+
280
+
281
+ # 空き実行レーン取得
282
+ def getLane(wait=true)
283
+ waitLane if wait and @LaneQue.empty?
284
+ return @LaneQue.shift
285
+ end
286
+
287
+ ## メモリ,CPUチェッカー
288
+ def runStateCheker
289
+ #何もしない
290
+ end
291
+
292
+ def waitall
293
+ rtn = []
294
+ while !@runpid.empty? or !@slppid.empty? do
295
+ rtn.concat(waitLane)
296
+ end
297
+ return rtn
298
+ end
299
+ end
300
+ end