Pre- and post-execution processing behavior
Job-based pre- and post-execution processing applies to both UNIX and Windows hosts. Host-based pre- and post-execution processing only applies to UNIX host.
Host type | Environment |
---|---|
UNIX |
|
Windows |
|
Command execution order for pre- and post-execution processing
Pre-execution processing flow/stages are:
- Host-based queue level pre-processing
- Host-based application level pre-processing
- Job-based queue level pre-processing
- Job-based job level pre-processing or job-based application level pre-processing
Post-execution processing flow/stages are:
- Job-based job level post-processing or job-based application level post-processing
- Job-based queue level post-processing
- Host-based application level post-processing
- Host-based queue level post-processing
If queue level host-based pre-execution processing fails, then application level host-based pre-execution processing will not be executed. If host-based pre-execution processing fails, then any other job-based pre-execution processing will not be executed. If host-based pre-execution processing fails, or the job fails, host-based post-execution processing is still executed to perform any cleanup activities. The execution result will be reported as a post processing result to the management host and shown by bhist. If application level host-based post-execution processing fails, queue level host-based post-execution processing is still executed.
Command behavior for job-based pre-execution processing
A pre-execution command returns information to LSF by means of the exit status. LSF holds the job in the queue until the specified pre-execution command returns an exit code of zero (0). If the pre-execution command exits with a non-zero value, the job pends until LSF tries again to dispatch it. While the job remains in the PEND state, LSF dispatches other jobs to the execution host.
If the pre-execution command exits with a value of 99, the job exits without pending. This allows you to cancel the job if the pre-execution command fails.
You must ensure that the pre-execution command runs without side effects; that is, you should define a pre-execution command that does not interfere with the job itself. For example, if you use the pre-execution command to reserve a resource, you cannot also reserve the same resource as part of the job submission.
LSF users can specify a pre-execution command at job submission. LSF first finds a suitable host on which to run the job and then runs the pre-execution command on that host. If the pre-execution command runs successfully and returns an exit code of zero, LSF runs the job.
Command behavior for job-based post-execution processing
A post-execution command runs after the job finishes, regardless of the exit state of the job. Once a post-execution command is associated with a job, that command runs even if the job fails. You cannot configure the post-execution command to run only under certain conditions.
The resource usage of post-execution processing is not included in the job resource usage calculation, and post-execution command exit codes are not reported to LSF.
setenv USER_POSTEXEC /path_name
If POST_EXEC=$USER_POSTEXEC and … | Then … |
---|---|
The user defines the USER_POSTEXEC environment variable |
|
The user does not define the USER_POSTEXEC environment variable |
|
Do not allow users to specify a post-execution command when the pre- and post-execution commands are set to run under the root account.
Command execution for host-based pre- and post-execution processing
All environment variables set for job execution are passed to and set for all execution hosts before host-based pre- and post-execution processing begins.
By default, host-based pre- and post-execution processing runs under the account of the user who submits the job. To run host-based pre and post execution commands under a different user account at the queue level (such as root for privileged operations), configure the parameter LSB_PRE_POST_EXEC_USER in lsf.sudoers. Also, the /etc/lsf.sudoers file must be deployed on all nodes in order to run host-based pre- and post-execution processing.
The execution is successful only if all of the following conditions are met:
- All execution hosts received the pre/post command.
- All execution hosts executed the command with exit code 0.
- All execution hosts executed the command within the specified timeout.
The execution result is aggregated to the first execution host and then reports to the management host.
If there is any assigned CPU affinity range, queue or application level host-based pre-execution processing is limited to run within that range. Host-based post-execution processing is not constrained to run within the CPU affinity range.
The rusage of host-based pre-execution on the first execution host will be collected and counted as job rusage. On a non-first execution host, the rusage of the host-based pre-execution will be ignored. During host-based post-execution, there is no rusage collection.
If sbatchd quits and a job finishes before sbatchd restarts, then host-based post-execution processing will be executed.
The following example shows host-based pre- and post-execution processing for normal low priority jobs, running only if hosts are lightly loaded:
bqueues -l normal
QUEUE: normal
-- Default queue.
PARAMETERS/STATISTICS
PRIO NICE STATUS MAX JL/U JL/P JL/H NJOBS PEND RUN SSUSP USUSP RSV
30 20 Open:Active - - - - 0 0 0 0 0 0
Interval for a host to accept two jobs is 0 seconds
SCHEDULING PARAMETERS
r15s r1m r15m ut pg io ls it tmp swp mem
loadSched - - - - - - - - - - -
loadStop - - - - - - - - - - -
SCHEDULING POLICIES: NO_INTERACTIVE
USERS: all
HOSTS: all
ADMINISTRATORS: Admin1
PRE_EXEC: echo "queue-level pre-exec" >> /tmp/pre.$LSB_JOBID.$LSB_JOBINDEX
POST_EXEC: echo "queue-level post-exec" >> /tmp/post.$LSB_JOBID.$LSB_JOBINDEX
HOST_PRE_EXEC: echo "queue-level host-based pre-exec" >> /tmp/pre.$LSB_JOBID.$LSB_JOBINDEX
HOST_POST_EXEC: echo "queue-level host-based post-exec" >> /tmp/post.$LSB_JOBID.$LSB_JOBINDEX
bapp -l app
APPLICATION NAME: app
STATISTICS:
NJOBS PEND RUN SSUSP USUSP RSV
0 0 0 0 0 0
PARAMETERS:
PRE_EXEC: echo "app-level pre-exec" >> /tmp/pre.$LSB_JOBID.$LSB_JOBINDEX
POST_EXEC: echo "app-level post-exec" >> /tmp/post.$LSB_JOBID.$LSB_JOBINDEX
RESIZABLE_JOBS: Auto
HOST_PRE_EXEC: echo "app-level host-based pre-exec" >> /tmp/pre.$LSB_JOBID.$LSB_JOBINDEX
HOST_POST_EXEC: echo "app-level host-based post-exec" >> /tmp/post.$LSB_JOBID.$LSB_JOBINDEX