Class: JobWorker

Inherits:
Object
  • Object
show all
Includes:
Sidekiq::Worker
Defined in:
lib/worker4.rb

Instance Method Summary collapse

Instance Method Details

#generate_new_job_script(log_dir, script_basename, script_content) ⇒ Object



23
24
25
26
27
28
29
30
31
# File 'lib/worker4.rb', line 23

def generate_new_job_script(log_dir, script_basename, script_content)
  new_job_script = File.basename(script_basename) + "_" + Time.now.strftime("%Y%m%d%H%M%S%L")
  new_job_script = File.join(log_dir, new_job_script)
  open(new_job_script, 'w') do |out|
    out.print script_content
    out.print "\necho __SCRIPT END__\n"
  end
  new_job_script
end

#perform(project_id, log_dir, script_basename, script_content) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/worker4.rb', line 40

def perform(project_id, log_dir, script_basename, script_content)
  #script_base_name = "test_job.sh"
  job_script = generate_new_job_script(log_dir, script_basename, script_content)
  log_file = job_script + "_o.log"
  err_file = job_script + "_e.log"
  command = "sbatch -o #{log_file} -e #{err_file} -N 1 #{job_script}"
  puts command
  ret = `#{command}`
  job_id = ret.chomp.split.last
  puts "JobID: #{job_id}"
  db0 = Redis.new(port: 6380, db: 0) # state + alpha DB
  db1 = Redis.new(port: 6380, db: 1) # log DB
  db2 = Redis.new(port: 6380, db: 2) # project jobs DB
  db1[job_id] = log_file
  pre_state = nil
  @start_time = nil
  begin
    command = "sacct --jobs=#{job_id} --format=state"
    puts command
    ret = `#{command}`
    #print ret
    state = ret.split(/\n/).last.strip
    puts "state: #{state}"
    #db.set(job_id, state)
    db0[job_id] = update_time_status(state, script_basename, "sushi_lover", project_id)

    unless state == pre_state
      db0[job_id] = update_time_status(state, script_basename, "sushi_lover", project_id)
      project_jobs = eval((db2[project_id]||[]).to_s)
      project_jobs = Hash[*project_jobs]
      project_jobs[job_id] = state
      p project_jobs
      db2[project_id] = project_jobs.to_a.flatten.last(200).to_s
      #db2[project_id] = project_jobs.to_s
    end
    pre_state = state
    sleep WORKER_INTERVAL
  end while state =~ /RUNNING/  or state =~ /PENDING/ or state =~ /---/
end

#update_time_status(status, script_basename, user, project_number) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/worker4.rb', line 32

def update_time_status(status, script_basename, user, project_number)
  unless @start_time
    @start_time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
  end
  time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
  [status, script_basename, [@start_time, time].join("/"), user, project_number].join(',')
end