class Condor::Job

Attributes

cmd[R]
dir[R]
finished[R]
id[R]
job_data[R]
priority[R]

Public Class Methods

new(cmd = nil, options = {}) click to toggle source
# File lib/condor-job/job.rb, line 10
def initialize(cmd = nil, options = {})
  options ||= {}
  @priority = options.delete(:priority)
  @avoid_finalize = !!options.delete(:no_finalizer)
  @home = `echo $HOME`.strip
  @home = nil if (@home || '').empty?
  @dir = options.delete(:directory) || Dir.pwd
  @id = options.delete(:id)
  @finished = false
  @job_data = nil
  @base_name = options.delete(:base_name) || "#{@dir}/cinput"
  @suppress_numbering = options.delete(:simple)
  
  options.empty? or raise "Unknown options: #{options.keys.inspect}"

  if @id
    @cmd = nil
    update
  else
    @id = nil
    @cmd = []
    @cmd << "#!/bin/bash"
    @cmd << "# encoding: UTF-8"
    @cmd << "source /etc/profile"
    @cmd << "source #{@home}/.profile" if @home and File.exist?("#{@home}/.profile")
    @cmd << "source #{@home}/.rvm/scripts/rvm" if @home and File.exist?("#{@home}/.rvm/scripts/rvm")        
    @cmd += [cmd].flatten
  end
  
  ObjectSpace.define_finalizer(self, proc { finalize_job }) unless @avoid_finalize
end

Public Instance Methods

alive?() click to toggle source
# File lib/condor-job/job.rb, line 96
def alive?; @id and !@finished; end
bash() click to toggle source
# File lib/condor-job/job.rb, line 102
def bash; IO.read(@bash); end
cleanup() click to toggle source
# File lib/condor-job/job.rb, line 82
def cleanup
  [@input, @log, @error, @output, @bash].each{|x| `rm #{x}` if x and File.exists?(x)} if @id
end
done?() click to toggle source
# File lib/condor-job/job.rb, line 91
def done?; @finished; end
error() click to toggle source
# File lib/condor-job/job.rb, line 98
def error; IO.read(@error); end
finalize_job() click to toggle source
# File lib/condor-job/job.rb, line 120
def finalize_job
  unless @avoid_finalize
    remove if !done?
    cleanup
  end
end
held?() click to toggle source
# File lib/condor-job/job.rb, line 94
def held?; @job_data ? (@job_data.job_status == '5') : false; end
idle?() click to toggle source
# File lib/condor-job/job.rb, line 93
def idle?; @job_data ? (@job_data.job_status == '1') : false; end
input() click to toggle source
# File lib/condor-job/job.rb, line 99
def input; IO.read(@input); end
log() click to toggle source
# File lib/condor-job/job.rb, line 100
def log; IO.read(@log); end
output() click to toggle source
# File lib/condor-job/job.rb, line 101
def output; IO.read(@output); end
priority=(val) click to toggle source
# File lib/condor-job/job.rb, line 86
def priority=(val)
  @priority = val
  set_priority
end
remove() click to toggle source
# File lib/condor-job/job.rb, line 116
def remove
  `condor_rm #{@id}` if @id
end
run(set_dir = nil) click to toggle source
# File lib/condor-job/job.rb, line 42
def run(set_dir = nil)
  @dir = set_dir || @dir
  name = if @suppress_numbering
    "#{@base_name}"
  else
    # get condor input file number
    num = (Dir["#{@base_name}*"].map{|x| File.basename(x).sub(@base_name,'').to_i}.max or 0) + 1
    "#{@base_name}#{num}"
  end
  
  @input, @log, @error, @output, @bash = ['.inp','.log','.error','.output',''].map{|x| "#{name}#{x}"}

  # create bash executable file to run
  File.open(@bash,'w'){|f| f.puts @cmd * "\n"}
  `chmod +x #{@bash}`

  input = []
  input << "Executable = #{@bash}"
  input << "Universe = vanilla"
  input << "Log = #{name}.log"
  input << "Error = #{name}.error"
  input << "Environment = HOME=#{@home}" if @home
  input << "Initialdir = #{@dir}"
  input << "Output = #{@output}"
  input << "Requirements = TARGET.OpSys == \"LINUX\""
  input << "Queue"

  File.open(@input, 'w'){|f| f.puts input * "\n"}
  if submit_output = `condor_submit #{@input}`.strip.split.last
    @id = submit_output + '0'
    set_priority
    update(true)
    @executed = true
  else
    @id = nil
    @executed = false
    @job_data = nil
  end        
end
running?() click to toggle source
# File lib/condor-job/job.rb, line 92
def running?; @job_data ? (@job_data.job_status == '2') : false; end
runtime() click to toggle source
# File lib/condor-job/job.rb, line 95
def runtime; @job_data ? Time.at(@job_data.server_time.to_f - @job_data.job_start_date.to_f).utc.strftime("%H:%M:%S") : nil; end
update(force = false) click to toggle source

update job information

# File lib/condor-job/job.rb, line 105
def update(force = false)
  Condor::Queue.load(force)
  return nil if !@id
  if @job_data = Condor::Queue[@id]
    return self
  else
    @finished = true 
    return nil
  end
end

Private Instance Methods

set_priority() click to toggle source
# File lib/condor-job/job.rb, line 129
def set_priority
  `condor_prio -p #{@priority} #{@id}` if alive?
end