rbbt-util 5.33.5 → 5.33.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bea55b2e4dd5972cf0e9646e84db4ce6ffd0556bb54796927640dbe3a3ba6611
4
- data.tar.gz: 281d52e1685badaba8427e5ffd2226e1a1ab61d66df30cc7cd88acb79ef5aa18
3
+ metadata.gz: aaa014ffdad4e098212cc3f7cefc4d04ac62a7f7fcbf17bbbab9415c6253d9ef
4
+ data.tar.gz: b8a2a233686ec2f229ed79bb19d87d8eb79ad945142305f7b61dcdb11f5f7912
5
5
  SHA512:
6
- metadata.gz: 459b75076980833dc1be3bd60d9fc98707270c626ab837e76a6c09180aaa2bd3328b4dea8776cf09c8fca0358e38258a30a90d17cd615450a38398c53bacfef0
7
- data.tar.gz: 1bb336e1a592b64fbb3e87453042e3f6f220b76c92f5e9ff7550aa25401fd3e36a823f31bddb0e8be6878fa7646b28a010ac320d6fd8e00066bd1ebf2e9f774f
6
+ metadata.gz: 564242bef1dd92c2f53a5fe6c967624de26d7ae7eeb4da1ef2a1f682db9cf6d4b0bf0f8e76b3a600afe6af7bb443df28a8fe50e570c3c56265319eb607d6c1fc
7
+ data.tar.gz: ac7c01fa7e8fccdff8dfc861b82f28889a68f77886c198ff55b09558b36857ec9c29a8bae979bc7d088f311ad81515676bc7a4cc30097fd6c4b7586e6838c0e3
@@ -544,7 +544,7 @@ env > #{batch_options[:fenv]}
544
544
  Misc.add_defaults options,
545
545
  :batch_dir => batch_dir,
546
546
  :inputs_dir => File.join(batch_dir, "inputs_dir"),
547
- :workflows => workflows_to_load * ","
547
+ :workflows => workflows_to_load.uniq * ","
548
548
 
549
549
  options[:procpath_performance] ||= File.join(batch_dir, "procpath##{procpath.gsub(',', '#')}") if procpath
550
550
 
@@ -1,6 +1,7 @@
1
1
  module HPC
2
2
  module Orchestration
3
3
  def self.check_chains(chains, job)
4
+ return [] if Symbol === job.overriden
4
5
  matches = []
5
6
  chains.each do |name, chain|
6
7
  next unless chain[:tasks].include?(job.workflow.to_s)
@@ -36,95 +37,6 @@ module HPC
36
37
  (job.dependencies + job.input_dependencies).uniq.select{|d| ! d.done? || d.dirty? }
37
38
  end
38
39
 
39
- #def self.job_workload(job)
40
- # workload = []
41
- # heap = []
42
- # heap << job
43
- # while job = heap.pop
44
- # next if job.done?
45
- # workload << job
46
- # heap.concat job_dependencies(job)
47
- # heap.uniq!
48
- # end
49
- # workload.uniq
50
- #end
51
-
52
- #def self.top_level_job(jobs)
53
- # top = jobs.select do |job|
54
- # (jobs - job_workload(job)).empty? &&
55
- # (job_workload(job) - jobs).select{|j| (job_workload(j) & jobs).any? }.empty?
56
- # end
57
- # return nil if top.length != 1
58
- # top.first
59
- #end
60
-
61
- #def self.job_chains(rules, job)
62
- # workload = job_workload(job)
63
- # chains = parse_chains(rules)
64
-
65
- # chain_jobs = {}
66
- # workload.each do |job|
67
- # check_chains(chains, job).each do |match|
68
- # chain_jobs[match] ||= []
69
- # chain_jobs[match] << job
70
- # end
71
- # end
72
-
73
- # job_chains = []
74
-
75
- # seen = []
76
- # chain_jobs.sort_by{|name,jobs| jobs.length }.reverse.each do |name,jobs|
77
- # remain = jobs - seen
78
- # next unless remain.length > 1
79
- # top_level_job = top_level_job(jobs)
80
- # next if top_level_job.nil?
81
- # job_chains << {:jobs => remain, :rules => chains[name][:rules], :top_level_job => top_level_job}
82
- # seen.concat remain
83
- # end
84
-
85
- # job_chains
86
- #end
87
-
88
- #def self._job_chains(rules, job)
89
- # workload = job_workload(job)
90
- # chains = parse_chains(rules)
91
-
92
- # matches = check_chains(chains, job)
93
-
94
- # job_chains = {}
95
- # job.dependencies.each do |dep|
96
- # dep_chains = _job_chains(rules, dep)
97
- # matches.each do |match|
98
- # if dep_chains[match] && dep_chains[match].include?(dep)
99
- # dep_chains[match].prepend job
100
- # end
101
- # end
102
- # job_chains.merge!(dep_chains)
103
- # end
104
-
105
- # matches.each do |match|
106
- # job_chains[match] ||= [job]
107
- # end
108
-
109
- # job_chains
110
- #end
111
-
112
- #def self.job_chains(rules, job)
113
- # job_chains = self._job_chains(rules, job)
114
- # iif job_chains
115
- # chains = parse_chains(rules)
116
-
117
- # seen = []
118
- # job_chains.collect do |name,jobs|
119
- # remain = jobs - seen
120
- # next unless remain.length > 1
121
- # top_level_job = top_level_job(jobs)
122
- # next if top_level_job.nil?
123
- # seen.concat remain
124
- # {:jobs => remain, :rules => chains[name][:rules], :top_level_job => top_level_job}
125
- # end.compact
126
- #end
127
-
128
40
  def self.job_chains(rules, job)
129
41
  chains = self.parse_chains(rules)
130
42
 
@@ -5,6 +5,23 @@ require 'rbbt/hpc/orchestrate/batches'
5
5
  module HPC
6
6
  module Orchestration
7
7
 
8
+ def prepare_for_execution(job)
9
+ rec_dependencies = job.rec_dependencies(true)
10
+
11
+ return if rec_dependencies.empty?
12
+
13
+ all_deps = rec_dependencies + [job]
14
+
15
+ all_deps.each do |dep|
16
+ begin
17
+ Step.prepare_for_execution(dep)
18
+ rescue RbbtException
19
+ next
20
+ end
21
+ end
22
+
23
+ end
24
+
8
25
  def orchestrate_job(job, options)
9
26
  options.delete "recursive_clean"
10
27
  options.delete "clean_task"
@@ -14,6 +31,9 @@ module HPC
14
31
  options.delete "detach"
15
32
  options.delete "jobname"
16
33
 
34
+ Log.high "Prepare for exec"
35
+ prepare_for_execution(job)
36
+
17
37
  if options[:orchestration_rules]
18
38
  rules = YAML.load(Open.read(options[:orchestration_rules]))
19
39
  elsif Rbbt.etc.slurm["default.yaml"].exists?
@@ -25,6 +45,7 @@ module HPC
25
45
  IndiferentHash.setup(rules)
26
46
 
27
47
  batches = HPC::Orchestration.job_batches(rules, job)
48
+ Log.high "Compute #{batches.length} batches"
28
49
 
29
50
  batch_ids = {}
30
51
  while batches.any?
@@ -60,7 +81,9 @@ module HPC
60
81
 
61
82
  if options[:dry_run]
62
83
  puts Log.color(:magenta, "Manifest: ") + Log.color(:blue, job_options[:manifest] * ", ") + " - tasks: #{job_options[:task_cpus] || 1} - time: #{job_options[:time]} - config: #{job_options[:config_keys]}"
63
- puts Log.color(:yellow, "Deps: ") + Log.color(:blue, job_options[:batch_dependencies]*", ")
84
+ puts Log.color(:magenta, "Deps: ") + Log.color(:blue, job_options[:batch_dependencies]*", ")
85
+ puts Log.color(:yellow, "Path: ") + top[:top_level].path
86
+ puts Log.color(:yellow, "Options: ") + job_options.inspect
64
87
  batch_ids[top] = top[:top_level].task_signature
65
88
  else
66
89
  id = run_job(top[:top_level], job_options)
@@ -167,8 +167,7 @@ module Path
167
167
 
168
168
  @path ||= {}
169
169
  rsearch_paths = (resource and resource.respond_to?(:search_paths)) ? resource.search_paths : nil
170
- key_elems = [where, caller_lib, rsearch_paths, paths]
171
- key = Misc.obj2digest(key_elems.inspect)
170
+ key = [where, caller_lib, rsearch_paths, paths].inspect
172
171
  self.sub!('~/', Etc.getpwuid.dir + '/') if self.include? "~"
173
172
 
174
173
  return @path[key] if @path[key]
@@ -1,13 +1,26 @@
1
1
  module Path
2
2
 
3
3
  def self.caller_lib_dir(file = nil, relative_to = ['lib', 'bin'])
4
- file = caller.reject{|l|
5
- l =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
6
- l =~ /rbbt\/resource\/path\.rb/ or
7
- l =~ /rbbt\/persist.rb/ or
8
- l =~ /rbbt\/util\/misc\.rb/ or
9
- l =~ /progress-monitor\.rb/
10
- }.first.sub(/\.rb[^\w].*/,'.rb') if file.nil?
4
+ #file = caller.reject{|l|
5
+ # l =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
6
+ # l =~ /rbbt\/resource\/path\.rb/ or
7
+ # l =~ /rbbt\/persist.rb/ or
8
+ # l =~ /rbbt\/util\/misc\.rb/ or
9
+ # l =~ /progress-monitor\.rb/
10
+ #}.first.sub(/\.rb[^\w].*/,'.rb') if file.nil?
11
+
12
+
13
+ if file.nil?
14
+ caller_dup = caller.dup
15
+ while file = caller_dup.shift
16
+ break unless file =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
17
+ file =~ /rbbt\/resource\/path\.rb/ or
18
+ file =~ /rbbt\/persist.rb/ or
19
+ file =~ /rbbt\/util\/misc\.rb/ or
20
+ file =~ /progress-monitor\.rb/
21
+ end
22
+ file = file.sub(/\.rb[^\w].*/,'.rb')
23
+ end
11
24
 
12
25
  relative_to = [relative_to] unless Array === relative_to
13
26
  file = File.expand_path(file)
@@ -1,4 +1,6 @@
1
1
  module Rbbt
2
+
3
+ prepare_for_execution(job)
2
4
  def self.migrate_source_paths(path, resource = Rbbt, source = nil)
3
5
  if source
4
6
  lpath, *paths = Misc.ssh_run(source, <<-EOF).split("\n")
@@ -44,6 +46,8 @@ puts resource[path].find(search_path)
44
46
  excludes += (options[:exclude] || "").split(/,\s*/)
45
47
  excludes_str = excludes.collect{|s| "--exclude '#{s}'" } * " "
46
48
 
49
+ hard_link = options[:hard_link]
50
+
47
51
  other = options[:other] || []
48
52
 
49
53
  test_str = options[:test] ? '-nv' : ''
@@ -82,6 +86,8 @@ puts resource[path].find(search_path)
82
86
  # rsync_args = "-avztAXHP --copy-unsafe-links"
83
87
  rsync_args = "-avztAHP --copy-unsafe-links"
84
88
 
89
+ rsync_args << " --link-dest '#{source_path}'" if hard_link && ! options[:source]
90
+
85
91
  cmd = "rsync #{rsync_args} #{test_str} #{files_from_str} #{excludes_str} '#{source_path}' #{target_path} #{other * " "}"
86
92
 
87
93
  cmd << " && rm -Rf #{source_path}" if options[:delete] && ! options[:files]
@@ -80,7 +80,7 @@ module Misc
80
80
  end
81
81
  when (defined? TSV and TSV)
82
82
  obj.with_unnamed do
83
- "TSV:{"<< fingerprint(obj.all_fields|| []).inspect << ";" << fingerprint(obj.keys).inspect << "}"
83
+ "TSV:{"<< fingerprint(obj.all_fields|| []) << ";" << fingerprint(obj.keys) << "}"
84
84
  end
85
85
  when Hash
86
86
  if obj.length > 10
@@ -297,14 +297,14 @@ module Misc
297
297
  str = case obj
298
298
  when nil
299
299
  'nil'
300
+ when Symbol
301
+ obj.to_s
300
302
  when TrueClass
301
303
  'true'
302
304
  when FalseClass
303
305
  'false'
304
306
  when Hash
305
307
  "{"<< obj.collect{|k,v| obj2str(k) + '=>' << obj2str(v)}*"," << "}"
306
- when Symbol
307
- obj.to_s
308
308
  when (defined?(Path) and Path)
309
309
  if defined?(Step) && Open.exists?(Step.info_file(obj))
310
310
  obj2str(Workflow.load_step(obj))
@@ -324,9 +324,10 @@ module Misc
324
324
  end
325
325
  when String
326
326
  good_filename = Misc.is_filename?(obj, false) && ! %w(. ..).include?(obj) && %w(. /).include?(obj[0])
327
- is_path = Path === obj
328
- if good_filename && ! is_path
329
- obj2str Path.setup(obj.dup)
327
+ if good_filename
328
+ obj = obj.dup
329
+ obj.extend Path
330
+ obj2str obj
330
331
  else
331
332
  obj = obj.chomp if String === obj
332
333
  if obj.length > HASH2MD5_MAX_STRING_LENGTH
@@ -339,7 +340,7 @@ module Misc
339
340
  if obj.length > HASH2MD5_MAX_ARRAY_LENGTH
340
341
  "[" << sample_large_obj(obj, HASH2MD5_MAX_ARRAY_LENGTH).collect{|v| obj2str(v)} * "," << "]"
341
342
  else
342
- "[" << obj.collect{|v| obj2str(v)} * "," << "]"
343
+ "[" << obj.collect{|v| obj2str(v) } * "," << "]"
343
344
  end
344
345
  when TSV::Parser
345
346
  remove_long_items(obj)
@@ -181,8 +181,8 @@ class Step
181
181
  # end
182
182
  #end
183
183
 
184
- Log.high "Some newer files found: #{Misc.fingerprint outdated_time}" if outdated_time.any?
185
- Log.high "Some outdated files found: #{Misc.fingerprint outdated_dep}" if outdated_dep.any?
184
+ Log.medium "Some newer files found: #{Misc.fingerprint outdated_time}" if outdated_time.any?
185
+ Log.medium "Some outdated files found: #{Misc.fingerprint outdated_dep}" if outdated_dep.any?
186
186
 
187
187
  outdated_time + outdated_dep
188
188
  end
@@ -5,10 +5,10 @@ module Workflow
5
5
 
6
6
  def self.job_workload(job)
7
7
  workload = {job => []}
8
- return workload if job.done?
8
+ return workload if job.done? && ! job.dirty?
9
9
 
10
10
  job.dependencies.each do |dep|
11
- next if dep.done?
11
+ next if dep.done? && ! job.dirty?
12
12
  workload.merge!(job_workload(dep))
13
13
  workload[job] += workload[dep]
14
14
  workload[job] << dep
@@ -16,7 +16,7 @@ module Workflow
16
16
  end
17
17
 
18
18
  job.input_dependencies.each do |dep|
19
- next if dep.done?
19
+ next if dep.done? && ! job.dirty?
20
20
  workload.merge!(job_workload(dep))
21
21
  workload[job] += workload[dep]
22
22
  workload[job] << dep
data/share/Rlib/plot.R CHANGED
@@ -38,3 +38,4 @@ geom_entity <- function (real.geom = NULL, mapping = NULL, data = NULL, stat = "
38
38
  rg
39
39
  }
40
40
 
41
+ rbbt.ggplot2.rotate_x_labels <- function(){ theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) }
@@ -185,6 +185,10 @@ compile(){
185
185
  local name=$1; shift
186
186
  local extra="$@"
187
187
 
188
+ if [ -f bootstrap ]; then
189
+ ./bootstrap
190
+ fi
191
+
188
192
  if [ -f Makefile -o -f makefile ]; then
189
193
  make -j 4 || exit -1
190
194
  make install || echo "No install"
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
22
22
  -s--search* Regular expression
23
23
  -t--tail* Show the last lines of the STDERR
24
24
  -l--long Show more entries
25
+ -c--compressed Show compressed information about entries
25
26
  -p--progress Report progress of job and the dependencies
26
27
  -BP--batch_parameters show batch parameters
27
28
  -BPP--batch_procpath show Procpath performance summary
@@ -185,6 +186,40 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
185
186
  end
186
187
 
187
188
 
189
+ count += 1
190
+
191
+ if options[:compressed]
192
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
193
+ if different_system
194
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
195
+ else
196
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
197
+ end
198
+ prog_rep = []
199
+ if options[:progress]
200
+ step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
201
+ if step_line
202
+ require 'rbbt/workflow'
203
+ step_path = step_line.split(": ").last.strip
204
+ step = Step.new step_path
205
+ step.load_dependencies_from_info
206
+ has_bar = false
207
+ (step.rec_dependencies + [step]).reverse.each do |j|
208
+ next if j.done?
209
+ if j.file(:progress).exists?
210
+ bar = Log::ProgressBar.new
211
+ bar.load(j.file(:progress).yaml)
212
+ prog_rep << bar.report_msg.split("·")[0..1]
213
+ end
214
+ end
215
+ end
216
+ end
217
+ workflow, task, name = step_path.split("/")[-3..-1]
218
+ job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
219
+ puts [job_str, status, prog_rep ].flatten * " "
220
+ next
221
+ end
222
+
188
223
  puts Log.color :blue, dir
189
224
  puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
190
225
  puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
@@ -232,22 +267,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
232
267
  cpu_average = {}
233
268
  rss_average = {}
234
269
  perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
235
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
270
+ time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
271
+ time = time.to_f
272
+
273
+ cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
274
+ cpu_average[stat_pid] ||= {}
275
+ cpu_average[stat_pid][time] ||= []
276
+ cpu_average[stat_pid][time] << cpu.to_f
277
+ rss_average[time] ||= []
278
+ rss_average[time] << rss.to_f * page_size
244
279
  end
245
280
 
246
281
  ticks = 0
247
282
  cpu_average.each do |stat_pid, cpu_average_pid|
248
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
283
+ start = cpu_average_pid.keys.sort.first
284
+ eend = cpu_average_pid.keys.sort.last
285
+ ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
251
286
  end
252
287
  start = rss_average.keys.sort.first
253
288
  eend = rss_average.keys.sort.last
@@ -284,7 +319,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
284
319
  puts CMD.cmd("grep -i -w 'Completed step' #{File.join(dir, 'std.err')} | grep -v 'Retrying dep.' | tail -n #{tail.to_i}", :no_fail => true).read
285
320
  else
286
321
  puts Log.color(:magenta, "Log tail: ")
287
- puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | tail -n #{tail.to_i} ").read
322
+ puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | grep -v \"\\(STDOUT\\|STDERR\\):[[:space:]]*$\" | tail -n #{tail.to_i} ").read
288
323
  end
289
324
  end
290
325
 
@@ -309,8 +344,6 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
309
344
  end
310
345
  end
311
346
 
312
- count += 1
313
-
314
347
  end
315
348
 
316
349
  puts
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
22
22
  -s--search* Regular expression
23
23
  -t--tail* Show the last lines of the STDERR
24
24
  -l--long Show more entries
25
+ -c--compressed Show compressed information about entries
25
26
  -p--progress Report progress of job and the dependencies
26
27
  -BP--batch_parameters show batch parameters
27
28
  -BPP--batch_procpath show Procpath performance summary
@@ -185,6 +186,40 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
185
186
  end
186
187
 
187
188
 
189
+ count += 1
190
+
191
+ if options[:compressed]
192
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
193
+ if different_system
194
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
195
+ else
196
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
197
+ end
198
+ prog_rep = []
199
+ if options[:progress]
200
+ step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
201
+ if step_line
202
+ require 'rbbt/workflow'
203
+ step_path = step_line.split(": ").last.strip
204
+ step = Step.new step_path
205
+ step.load_dependencies_from_info
206
+ has_bar = false
207
+ (step.rec_dependencies + [step]).reverse.each do |j|
208
+ next if j.done?
209
+ if j.file(:progress).exists?
210
+ bar = Log::ProgressBar.new
211
+ bar.load(j.file(:progress).yaml)
212
+ prog_rep << bar.report_msg.split("·")[0..1]
213
+ end
214
+ end
215
+ end
216
+ end
217
+ workflow, task, name = step_path.split("/")[-3..-1]
218
+ job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
219
+ puts [job_str, status, prog_rep ].flatten * " "
220
+ next
221
+ end
222
+
188
223
  puts Log.color :blue, dir
189
224
  puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
190
225
  puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
@@ -232,22 +267,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
232
267
  cpu_average = {}
233
268
  rss_average = {}
234
269
  perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
235
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
270
+ time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
271
+ time = time.to_f
272
+
273
+ cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
274
+ cpu_average[stat_pid] ||= {}
275
+ cpu_average[stat_pid][time] ||= []
276
+ cpu_average[stat_pid][time] << cpu.to_f
277
+ rss_average[time] ||= []
278
+ rss_average[time] << rss.to_f * page_size
244
279
  end
245
280
 
246
281
  ticks = 0
247
282
  cpu_average.each do |stat_pid, cpu_average_pid|
248
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
283
+ start = cpu_average_pid.keys.sort.first
284
+ eend = cpu_average_pid.keys.sort.last
285
+ ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
251
286
  end
252
287
  start = rss_average.keys.sort.first
253
288
  eend = rss_average.keys.sort.last
@@ -284,7 +319,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
284
319
  puts CMD.cmd("grep -i -w 'Completed step' #{File.join(dir, 'std.err')} | grep -v 'Retrying dep.' | tail -n #{tail.to_i}", :no_fail => true).read
285
320
  else
286
321
  puts Log.color(:magenta, "Log tail: ")
287
- puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | tail -n #{tail.to_i} ").read
322
+ puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | grep -v \"\\(STDOUT\\|STDERR\\):[[:space:]]*$\" | tail -n #{tail.to_i} ").read
288
323
  end
289
324
  end
290
325
 
@@ -309,8 +344,6 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
309
344
  end
310
345
  end
311
346
 
312
- count += 1
313
-
314
347
  end
315
348
 
316
349
  puts
@@ -22,6 +22,7 @@ $ rbbt slurm list [options]
22
22
  -s--search* Regular expression
23
23
  -t--tail* Show the last lines of the STDERR
24
24
  -l--long Show more entries
25
+ -c--compressed Show compressed information about entries
25
26
  -p--progress Report progress of job and the dependencies
26
27
  -BP--batch_parameters show batch parameters
27
28
  -BPP--batch_procpath show Procpath performance summary
@@ -185,6 +186,40 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
185
186
  end
186
187
 
187
188
 
189
+ count += 1
190
+
191
+ if options[:compressed]
192
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) : Log.color(:green, id)
193
+ if different_system
194
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : Log.color(:green, id)
195
+ else
196
+ status = exit_status ? (exit_status == 0 ? Log.color(:green, "Done") : Log.color(:red, "Error")) + " (#{ id })" : (running_jobs.include?(id) || $norunningjobs ? Log.color(:green, id) : Log.color(:red, id) )
197
+ end
198
+ prog_rep = []
199
+ if options[:progress]
200
+ step_line = Open.read(fcmd).split("\n").select{|line| line =~ /^#STEP_PATH:/}.first
201
+ if step_line
202
+ require 'rbbt/workflow'
203
+ step_path = step_line.split(": ").last.strip
204
+ step = Step.new step_path
205
+ step.load_dependencies_from_info
206
+ has_bar = false
207
+ (step.rec_dependencies + [step]).reverse.each do |j|
208
+ next if j.done?
209
+ if j.file(:progress).exists?
210
+ bar = Log::ProgressBar.new
211
+ bar.load(j.file(:progress).yaml)
212
+ prog_rep << bar.report_msg.split("·")[0..1]
213
+ end
214
+ end
215
+ end
216
+ end
217
+ workflow, task, name = step_path.split("/")[-3..-1]
218
+ job_str = [Log.color(:yellow, workflow), Log.color(:magenta, task), name] * "/"
219
+ puts [job_str, status, prog_rep ].flatten * " "
220
+ next
221
+ end
222
+
188
223
  puts Log.color :blue, dir
189
224
  puts Log.color(:magenta, "Creation: ") << File.mtime(File.join(dir, 'command.batch')).to_s if long
190
225
  puts Log.color(:magenta, "Started: ") << File.ctime(File.join(dir, 'std.err')).to_s if File.exist?(File.join(dir, 'std.err')) && long
@@ -232,22 +267,22 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
232
267
  cpu_average = {}
233
268
  rss_average = {}
234
269
  perf.through :key, ["ts", 'stat_pid', "stat_utime", "stat_stime", "stat_cutime", "stat_cstime", "stat_rss"] do |k, values|
235
- time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
236
- time = time.to_f
237
-
238
- cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
239
- cpu_average[stat_pid] ||= {}
240
- cpu_average[stat_pid][time] ||= []
241
- cpu_average[stat_pid][time] << cpu.to_f
242
- rss_average[time] ||= []
243
- rss_average[time] << rss.to_f * page_size
270
+ time, stat_pid, ucpu, scpu, ccpu, cscpu, rss = values
271
+ time = time.to_f
272
+
273
+ cpu = Misc.sum([ucpu, scpu].collect{|v| v.to_f})
274
+ cpu_average[stat_pid] ||= {}
275
+ cpu_average[stat_pid][time] ||= []
276
+ cpu_average[stat_pid][time] << cpu.to_f
277
+ rss_average[time] ||= []
278
+ rss_average[time] << rss.to_f * page_size
244
279
  end
245
280
 
246
281
  ticks = 0
247
282
  cpu_average.each do |stat_pid, cpu_average_pid|
248
- start = cpu_average_pid.keys.sort.first
249
- eend = cpu_average_pid.keys.sort.last
250
- ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
283
+ start = cpu_average_pid.keys.sort.first
284
+ eend = cpu_average_pid.keys.sort.last
285
+ ticks += Misc.sum(cpu_average_pid[eend]) - Misc.sum(cpu_average_pid[start])
251
286
  end
252
287
  start = rss_average.keys.sort.first
253
288
  eend = rss_average.keys.sort.last
@@ -284,7 +319,7 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
284
319
  puts CMD.cmd("grep -i -w 'Completed step' #{File.join(dir, 'std.err')} | grep -v 'Retrying dep.' | tail -n #{tail.to_i}", :no_fail => true).read
285
320
  else
286
321
  puts Log.color(:magenta, "Log tail: ")
287
- puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | tail -n #{tail.to_i} ").read
322
+ puts CMD.cmd(" cat #{File.join(dir, 'std.err')} | grep -v '^[^\\s:]*\\[3.m' | grep -v -e '^[[:space:]]*$' | grep -v \"\\(STDOUT\\|STDERR\\):[[:space:]]*$\" | tail -n #{tail.to_i} ").read
288
323
  end
289
324
  end
290
325
 
@@ -309,8 +344,6 @@ workdir.glob("**/command.batch").sort_by{|f| File.mtime(f)}.each do |fcmd|
309
344
  end
310
345
  end
311
346
 
312
- count += 1
313
-
314
347
  end
315
348
 
316
349
  puts
@@ -37,7 +37,7 @@ file = ARGV.shift
37
37
  $seen = []
38
38
  def get_step(file)
39
39
  file = File.expand_path(file)
40
- file = file.sub(/\.(info|files)/,'')
40
+ file = file.sub(/\.(info|files)$/,'')
41
41
  $seen << file
42
42
  Workflow.load_step file
43
43
  end
@@ -219,8 +219,8 @@ help = !!options.delete(:help)
219
219
  do_fork = !!options.delete(:fork)
220
220
  detach = !!options.delete(:detach)
221
221
  do_exec = !!options.delete(:exec)
222
- clean = !!options.delete(:clean)
223
222
  clean_task = options.delete(:clean_task)
223
+ clean = !!options.delete(:clean) || clean_task
224
224
  override_deps = options.delete(:override_deps)
225
225
  recursive_clean = !!options.delete(:recursive_clean)
226
226
  out = options.include?(:output) ? File.open(options[:output], 'wb') : STDOUT
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.33.5
4
+ version: 5.33.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-04 00:00:00.000000000 Z
11
+ date: 2022-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake