#!/usr/bin/env ruby # $Id$ # $URL$ JOBSDIR = "jobs" PARKDIR = "park" PROCDIR = "processors" RESULTDIR = "results" FAILDIR = "failure" MONITORDIR = "monitor" CONFIG = "config" @config = { "waittime" => 3, "maxproc" => 3 } COUNTERFILE="jobscounter" RUNNINGFILE="runningcounter" def usage puts < add >-->-------Add the given command as a job. addfile|af >------Add the given file as a job. createconfing>-->-------Write a default configuration file. run>---->------->-------Start the master scheduler process. del >---->-------Delete the given job from the queue. help|-h>>------->-------Show this help. park>--->------->-------Place all queued jobs in the parkinglot. unpark>->------->-------Place all jobs from the parkinglot back in the queue. retry >-->-------Reschedule a failed job. Destroys all output. prio >---Change the priority of the given job.>--[unimplemented] status|st>------>-------Show the status of the current jobs. stop >--->-------Stop the given job.>----[unimplemented] stopall>>------->-------Stop all running jobs.>-[unimplemented] ENDTXT exit end def readconfig File.open("#{@basedir}/#{CONFIG}").each_line {|line| line.sub!(/#.*/, "") line.sub!(/^\s*/, "") line.sub!(/\s*$/, "") if line.match(/^$/) next end line.match(/([^=]*?)\s*=\s*(.*)/) case $1 when "maxproc" then @config["maxproc"] = $2 when "waittime" then @config["waittime"] = $2 else puts "unknown option #{$1}" end } end def status readconfig # show which jobs are running puts "Running jobs (#{Dir.entries("#{@basedir}/#{PROCDIR}").size - 2}/#{@config["maxproc"]}):" # just call 'ls' instead of trying to figure out how to format it nicely for the screen system("ls" ,"#{@basedir}/#{PROCDIR}/") # show queues puts "Jobs queued (#{Dir.entries("#{@basedir}/#{JOBSDIR}").size - 2}):" system("ls", "#{@basedir}/#{JOBSDIR}/") puts "Jobs parked (#{Dir.entries("#{@basedir}/#{PARKDIR}").size - 2}):" puts "Jobs finished: #{Dir.entries("#{@basedir}/#{RESULTDIR}").size - 2}" puts "Jobs failed (#{Dir.entries("#{@basedir}/#{FAILDIR}").size - 2}):" system("ls", "#{@basedir}/#{FAILDIR}/") end def createdirs [ JOBSDIR, PARKDIR, PROCDIR, RESULTDIR, FAILDIR, MONITORDIR ].each{|dir| if ! FileTest.directory?("#{@basedir}/#{dir}") Dir.mkdir("#{@basedir}/#{dir}") end } end def increasejobscounter jobscounter = 0 if FileTest.exists?(COUNTERFILE) File.new(COUNTERFILE).flock(File::LOCK_EX) File.open(COUNTERFILE, "r+"){|file| jobscounter = file.read if jobscounter.empty? jobscounter = 0 end jobscounter = jobscounter.to_i jobscounter += 1 file.seek(0) file.puts jobscounter } File.new(COUNTERFILE, "r+").flock(File::LOCK_UN) else File.open(COUNTERFILE, "w"){|file| File.new(COUNTERFILE).flock(File::LOCK_EX) jobscounter = 1 file.puts jobscounter } File.new(COUNTERFILE, "r+").flock(File::LOCK_UN) end return jobscounter end def addjob p ARGV.join(" ") jobnumber=sprintf("%06d", increasejobscounter) p jobnumber end def addjobfromfile # File.copy asdfasdf end def createconfig if ! FileTest.exists?("#{@basedir}/#{CONFIG}") File.new("#{@basedir}/#{CONFIG}", "w"){|file| file.puts <