diff --git a/pbatch/pb.rb b/pbatch/pb.rb new file mode 100755 index 0000000..c5f9f7f --- /dev/null +++ b/pbatch/pb.rb @@ -0,0 +1,176 @@ +#!/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 File.exists(COUNTERFILE) + File.new(COUNTERFILE, "r+").flock(File::LOCK_EX){|file| + jobscounter = file.read.to_i + jobscounter += 1 + file.seek(0) + file.puts jobscounter + } + else + File.new(COUNTERFILE, "w").flock(File::LOCK_EX){|file| + jobscounter = 1 + file.puts jobscounter + } + end + return jobscounter +end + +def addjob + p ARGV.join(" ") +end + +def addjobfromfile + # File.copy asdfasdf +end + +def createconfig + if ! FileTest.exists?("#{@basedir}/#{CONFIG}") + File.new("#{@basedir}/#{CONFIG}", "w"){|file| + file.puts <