The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Schedule::SGELK

SYNOPSIS

A module for submitting jobs to an SGE queue.

use Schedule::SGELK
my $sge=Schedule::SGELK->new(verbose=>1,numnodes=>5,numcpus=>8,workingdir=>"SGE/",waitForEachJobToStart=>1);
$sge->set("jobname","thisisaname");
# run a series of jobs and wait for them all to finish
my $job=$sge->pleaseExecute("sleep 60");
my $job2=$sge->pleaseExecute("sleep 60");
$sge->wrapItUp();
# or you can specify which jobs to wait for
$sge->waitOnJobs([$job,$job2],1); # 1 means wait for all jobs to finish; 0 to wait for any free node
# or in one step
$sge->pleaseExecute_andWait("sleep 60");

A quick test for this module is the following one-liner

perl -MSchedule::SGELK -e '$sge=Schedule::SGELK->new(numnodes=>5); for(1..3){$sge->pleaseExecute("sleep 3");}$sge->wrapItUp();'

Another quick test is to use the test() method, if you want to see standardized text output (see test() below)

perl -MSchedule::SGELK -e '$sge=Schedule::SGELK->new(-numnodes=>2,-numcpus=>8); $sge->test(\%tmpSettings);'

DESCRIPTION

A module for submitting jobs to an SGE queue. Monitoring is performed using a combination of monitoring files written to the hard drive and qstat. Submitting is performed internally by making a perl script.

AUTHOR

Author: Lee Katz <lkatz@cdc.gov>

METHODS

sub new

create a new instance of a scheduler. Arguments and their defaults:

numnodes=>50 maximum nodes to use
numcpus=>128 maximum cpus that will be used per node in a script
maxslots=>9999 maximum slots that you can use. Useful if you want to be limited by total slots instead of nodes or CPUs. E.g. {numnodes=>100,numcpus=>1,maxslots=>20}
verbose=>0
workingdir=>$ENV{PWD} a directory that all nodes can access to read/write jobs and log files
waitForEachJobToStart=>0 Allow each job to start as it's run (0), or to wait until the qstat sees the job before continuing (1)
jobname=>... This is the name given to the job when you view it with qstat. By default, it will be named after the script that calls this module.
warn_on_error=>1 This will make the script give a warning instead of exiting
qsubxopts=>... These are extra options to pass to qsub.  E.g., {qsubxopts=>"-V"}  Options are overwritten by appending them to the within-script options. Therefore this is not the best way to choose a different queue but it is a way to change a job name or the number of processors.
noqsub=>1 Force performing a system call instead of using qsub
queue=>all.q    Choose the queue to use for a new job.  Default: all.q

Examples:
{numnodes=>100,numcpus=>1,maxslots=>50} # for many small jobs
{numnodes=>5,numcpus=>8,maxslots=>40} # for a few larger jobs (note: maxslots should be >= numnodes * maxslots
sub error($msg,$exit_code) or error()

Get or set the error. Can set the error code too, if provided.

sub set() get() settings()

Get or set a setting. All settings are listed under sub new(). If a setting is provided without a value, then nothing new will be set, and only the value of the specified setting will be returned.

pleaseExecute()

This is the main method. It will submit a command to the cluster.

$sge->set("jobname","a_nu_start");
$sge->pleaseExecute("someCommand with parameters");

If you are already occupying more than numnodes, then it will pause before executing the command. It will also create many files under workingdir, so be sure to specify it. The workingdir is the current directory by default.

You can also specify temporary settings for this one command with a referenced hash.

$sge->pleaseExecute("someCommand with parameters",{jobname=>"a_nu_start",numcpus=>2});
pleaseExecute_andWait()

Exact same as pleaseExecute(), except it will wait for the command to finish before continuing. Internally calls pleaseExecute() and then waitOnJobs(). However one key difference between pleaseExecute() and this sub is that you can give a list of commands.

# this will take 100 seconds because all commands have to finish.
$sge->pleaseExecute_andWait(["sleep 60","sleep 100","sleep 3"]);
checkJob($jobHash)

Checks the status of a given job. The job variable is obtained from pleaseExecute(). $self->error can be set if there is an error in the job. Return values: 1 for finished; 0 for still running or hasn't started; -1 for error.

jobStatus(jobid)

Given an SGE job id, it returns its qstat status

qstat

Runs qstat and caches the result for one second. Or, returns the cached result of qstat

wrapItUp()

Waits on all jobs to finish before pausing the program. Calls waitOnJobs or joinAllThreads internally. Does not take any parameters.

joinAllThreads($jobList)

Joins all threads. This is if you have ithreads and if the scheduler is not set. For example, if you specify noqsub or if qsub executable is not found.

waitOnJobs($jobList,[$mustFinish])

Waits on all given jobs to finish. The job list are jobs as given by pleaseExecute(). If $mustFinish evaluates to true, then the program will pause until all jobs are finished. Calls on checkJob() internally. Will die with an error message if a job dies.

cleanAJob

This is internally used for cleaning up files after a job is done. Do not use externally.

test

Use this method to perform a test. The test sends ten jobs that print debugging information.

You can give an optional hash argument to send other settings as described in new().

perl -MSchedule::SGELK -e '$sge=Schedule::SGELK->new(-numnodes=>2,-numcpus=>8); $sge->test(\%tmpSettings);'