Job submission and execution controls behavior

The following examples illustrate how customized esub, epsub, and eexec executable files can control job submission and execution.

Validating job submission parameters by using esub

When a user submits a job by using the bsub -P command option, LSF accepts any project name that is entered by the user and associates that project name with the job. This example shows an esub that supports project-based accounting by enforcing the use of valid project names for jobs that are submitted by users who are eligible to charge to those projects. If a user submits a job to any project other than proj1 or proj2, or if the user name is not user1 or user2, LSF rejects the job based on the exit value of LSB_SUB_ABORT_VALUE.
#!/bin/sh 

. $LSB_SUB_PARM_FILE 

# Redirect stderr to stdout so echo can be used for error messages exec 1>&2 
# Check valid projects 
if [ $LSB_SUB_PROJECT_NAME != "proj1" -o $LSB_SUB_PROJECT_NAME != "proj2" ]; then
   echo "Incorrect project name specified"
   exit $LSB_SUB_ABORT_VALUE 
fi 

USER=`whoami` 
if [ $LSB_SUB_PROJECT_NAME="proj1" ]; then   
# Only user1 and user2 can charge to proj1   
   if [$USER != "user1" -a $USER != "user2" ]; then
      echo "You are not allowed to charge to this project"
      exit $LSB_SUB_ABORT_VALUE
   fi 
fi

Changing job submission parameters by using esub

The following example shows an esub that modifies job submission options and environment variables based on the user name that submits a job. This esub writes the changes to LSB_SUB_MODIFY_FILE for userA and to LSB_SUB_MODIFY_ENVFILE for userB. LSF rejects all jobs that are submitted by userC without writing to either file:
#!/bin/sh 
. $LSB_SUB_PARM_FILE 

# Redirect stderr to stdout so echo can be used for error messages exec 1>&2
USER=`whoami` 
# Make sure userA is using the right queue queueA 
if [ $USER="userA" -a $LSB_SUB_QUEUE != "queueA" ]; then
   echo "userA has submitted a job to an incorrect queue"
   echo "...submitting to queueA"
   echo 'LSB_SUB_QUEUE="queueA"' > $LSB_SUB_MODIFY_FILE 
fi 

# Make sure userB is using the right shell (/bin/sh) 
if [ $USER="userB" -a $SHELL != "/bin/sh" ]; then
   echo "userB has submitted a job using $SHELL"
   echo "...using /bin/sh instead"
   echo 'SHELL="/bin/sh"' > $LSB_SUB_MODIFY_ENVFILE 
fi 

# Deny userC the ability to submit a job 
if [ $USER="userC" ]; then
   echo "You are not permitted to submit a job."
   exit $LSB_SUB_ABORT_VALUE
fi

Monitoring the execution environment by using eexec

This example shows how you can use an eexec to monitor job execution:
#!/bin/sh
# eexec
# Example script to monitor the number of jobs executing through RES.
# This script works in cooperation with an elim that counts the
# number of files in the TASKDIR directory. Each RES process on a host
# will have a file in the TASKDIR directory.
# Don’t want to monitor lsbatch jobs.
if [ "$LSB_JOBID" != "" ] ; then
    exit 0
fi

TASKDIR="/tmp/RES_dir" 
# directory containing all the task files 
# for the host. 
# you can change this to whatever
# directory you wish, just make sure anyone
# has read/write permissions.

# if TASKDIR does not exist create it

if [ "test -d $TASKDIR" != "0" ] ; then
   mkdir $TASKDIR > /dev/null 2>&1
fi

# Need to make sure LS_JOBPID, and USER are defined
# exit normally
if [ "test -z $LS_JOBPID"="0" ] ; then
    exit 0
elif [ "test -z $USER" =  "0" ] ; then
     exit 0
fi

taskFile="$TASKDIR/$LS_JOBPID.$USER"

# Fork grandchild to stay around for the duration of the task

touch $taskFile >/dev/null 2>&1
(
        (while : ;
        do
                kill -0 $LS_JOBPID >/dev/null 2>&1
                if [ $? -eq 0 ] ; then
                        sleep 10  # this is the poll interval
                                  # increase it if you want but
                                  # see the elim for its
                                  # corresponding update interval    
                else
                        rm $taskFile >/dev/null 2>&1 
                        exit 0
                fi
        done)&
)&
wait

Monitoring job submission information by using epsub

This example shows how you can use an epsub to monitor job submission:
#!/bin/sh
# epsub
# Example script to monitor job submissions to mbatchd.
# This script outputs the final job submission parameters after the
# job is submitted.
exec 1>&2
. $LSB_SUB_PARM_FILE
echo I am  epsub app >>/home/user1/epsub.out

echo $LSB_SUB_JOB_QUEUE t
echo $LSB_SUB_JOB_ID >> /home/user1/epsub.$LSB_SUB_JOB_ID
echo $LSB_SUB_JOB_ERR

Passing data between esub and eexec

A combination of esub and eexec executable files can be used to pass AFS/DCE tokens from the submission host to the execution host. LSF passes data from the standard output of esub to the standard input of eexec. A daemon wrapper script can be used to renew the tokens.