Job submission and execution controls behavior

The following examples illustrate how customized esub and eexec executables can control job submission and execution.

Validating job submission parameters using esub

When a user submits a job using bsub-P, LSF accepts any project name 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 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 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 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 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

Passing data between esub and eexec

A combination of esub and eexec executables 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.