执行前和执行后处理行为
基于作业的执行前和执行后处理适用于 UNIX 和 Windows 主机。 基于主机的执行前和执行后处理仅适用于 UNIX 主机。
| 主机类型 | 环境 |
|---|---|
| UNIX |
|
| Windows |
|
用于执行前和执行后处理的命令执行顺序
执行前处理流程/阶段为:
- 基于主机的队列级别预处理
- 基于主机的应用程序级别预处理
- 基于作业的队列级别预处理
- 基于作业的作业级别预处理或基于作业的应用程序级别预处理
执行后处理流程/阶段为:
- 基于作业的作业级别后处理或基于作业的应用程序级别后处理
- 基于作业的队列级别后处理
- 基于主机的应用程序级别后处理
- 基于主机的队列级别后处理
如果基于队列级别主机的预执行处理失败,那么将不会执行基于应用程序级别主机的预执行处理。 如果基于主机的预执行处理失败,那么将不会执行任何其他基于作业的预执行处理。 如果基于主机的执行前处理失败,或者作业失败,那么仍将执行基于主机的执行后处理以执行任何清除活动。 执行结果将作为后处理结果报告给 管理 主机,并由 bhist显示。 如果基于应用程序级别主机的执行后处理失败,那么仍将执行基于队列级别主机的执行后处理。
基于作业的执行前处理的命令行为
执行前命令通过退出状态将信息返回到 LSF 。 LSF 在队列中保留该作业,直到指定的预执行命令返回零(0)退出代码。 如果预执行命令退出时返回非零值,则作业将挂起,直到 LSF 再次尝试调度它。 当该任务仍处于 “等待”状态时, LSF 会将其他任务发送给执行主机。
如果执行前命令以值 99 退出,那么作业将退出而不处于暂挂状态。 这允许您在执行前命令失败时取消作业。
setenv USER_PREEXEC /path_name其中,预执行命令的路径名是绝对路径。必须确保预执行命令运行时不会产生副作用; 即,您应该定义不会干扰作业本身的预执行命令。 例如,如果使用预执行命令来预留资源,那么在作业提交过程中也不能预留相同的资源。
LSF 用户在提交作业时可以指定一个预执行命令。 LSF 首先找到一个合适的宿主来运行作业,然后在宿主上运行预执行命令。 如果预执行命令成功运行并返回退出代码为零,则 LSF 将运行该作业。
基于作业的执行后处理的命令行为
执行后命令在作业完成后运行,而不考虑作业的退出状态。 一旦执行后命令与作业相关联,即使该作业失败,该命令也会运行。 不能将执行后命令配置为仅在特定条件下运行。
作业资源使用量计算中不包括执行后处理资源使用量,执行后命令退出代码也不会报告给 LSF 。
setenv USER_POSTEXEC /path_name其中执行后命令的路径名是绝对路径。
| 如果 POST_EXEC=$USER_POSTEXEC 并且 ... | 然后 |
|---|---|
| 用户定义 USER_POSTEXEC 环境变量 |
|
| 用户未定义 USER_POSTEXEC 环境变量 |
|
基于主机的执行前和执行后处理的命令执行
在开始基于主机的执行前和执行后处理之前,会将为作业执行设置的所有环境变量传递到所有执行主机并对其进行设置。
缺省情况下,基于主机的执行前和执行后处理在提交作业的用户的帐户下运行。 要在队列级别的其他用户帐户 (例如,特权操作的 root 用户) 下运行基于主机的执行前和执行后命令,请在 lsf.sudoers中配置参数 LSB_PRE_POST_EXEC_USER 。 此外,为了运行基于主机的执行前和执行后处理,必须将 /etc/lsf.sudoers 文件部署在所有节点上。
仅当满足以下所有条件时,执行才会成功:
- 所有执行主机都接收到 pre/post 命令。
- 所有执行主机都执行了具有退出代码 0 的命令。
- 所有执行主机都在指定的超时内执行了该命令。
执行结果将聚集到第一个执行主机,然后向 管理 主机报告。
如果存在任何已分配的 CPU 亲缘关系范围,那么基于队列或应用程序级别主机的执行前处理将限制为在该范围内运行。 基于主机的执行后处理不会限制为在 CPU 亲缘关系范围内运行。
将收集第一个执行主机上基于主机的预执行的 rusage ,并将其计为作业 rusage。 在非第一个执行主机上,将忽略基于主机的预执行的 rusage 。 在基于主机的执行后,没有 rusage 集合。
如果 sbatchd 退出并且作业在 sbatchd 重新启动之前完成,那么将执行基于主机的执行后处理。
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