Class: JobChecker

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

Instance Method Summary collapse

Instance Method Details

#generate_new_job_script(log_dir, script_basename, script_content) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/job_checker.rb', line 37

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(job_id, script_basename, log_file, user, project_id, next_dataset_id = nil, rails_host = nil, log_dir = nil, copy_command_template = nil) ⇒ Object



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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/job_checker.rb', line 54

def perform(job_id, script_basename, log_file, user, project_id, next_dataset_id=nil, rails_host=nil, log_dir=nil, copy_command_template=nil)
  puts "JobID (in JobChecker): #{job_id}"
  db0 = Redis.new(port: PORT, db: 0) # state + alpha DB
  db1 = Redis.new(port: PORT, db: 1) # log DB
  db2 = Redis.new(port: PORT, 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}"
    db0[job_id] = update_time_status(state, script_basename, user, project_id, next_dataset_id, rails_host, log_dir)

    unless state == pre_state
      db0[job_id] = update_time_status(state, script_basename, user, project_id, next_dataset_id, rails_host, log_dir)
      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
    end
    pre_state = state
    sleep WORKER_INTERVAL
  end while state =~ /RUNNING/  or state =~ /PENDING/ or state =~ /---/

  # post process
  if next_dataset_id and rails_host
    uri = URI("#{rails_host}/data_set/#{next_dataset_id}/update_completed_samples")
    #p uri
    res = Net::HTTP.get_response(uri)

    if log_dir and !log_dir.empty?
      copy_command = copy_command_template.gsub("org_file", log_file)
      #puts "copy_command=#{copy_command}"
      system copy_command
      err_file = log_file.gsub('_o.log','_e.log')
      copy_command = copy_command_template.gsub("org_file", err_file)
      #puts "copy_command=#{copy_command}"
      system copy_command
    end
  end
end

#update_time_status(status, script_basename, user, project_number, next_dataset_id, rails_host, log_dir) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/job_checker.rb', line 46

def update_time_status(status, script_basename, user, project_number, next_dataset_id, rails_host, log_dir)
  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, next_dataset_id, rails_host, log_dir].join(',')
end