执行前和执行后处理行为

基于作业的执行前和执行后处理适用于 UNIX 和 Windows 主机。 基于主机的执行前和执行后处理仅适用于 UNIX 主机。


主机类型 环境
UNIX
  • 执行前和执行后命令在 /bin/sh -c下的 /tmp 目录中运行,这允许在命令中使用 shell 功能。 以下示例显示了有效的配置行:
    PRE_EXEC=/usr/share/lsf/misc/testq_pre >> /tmp/pre.out POST_EXEC= /usr/share/lsf/misc/testq_post | grep -v "Testing..."
  • LSF将 PATH 环境变量设置为 PATH = '/bin /usr/bin /sbin /usr/sbin'
  • stdinstdoutstderr 设置为 /dev/null
Windows
  • 执行前和执行后命令在 cmd.exe /c 下运行
  • 标准输入,标准输出和标准错误设置为 NULL
  • PATH 由 LSF 服务的设置确定

注: 如果执行前或执行后命令不在通常的执行路径中,那么必须指定命令的完整路径名。

用于执行前和执行后处理的命令执行顺序

执行前处理流程/阶段为:

  1. 基于主机的队列级别预处理
  2. 基于主机的应用程序级别预处理
  3. 基于作业的队列级别预处理
  4. 基于作业的作业级别预处理或基于作业的应用程序级别预处理

执行后处理流程/阶段为:

  1. 基于作业的作业级别后处理或基于作业的应用程序级别后处理
  2. 基于作业的队列级别后处理
  3. 基于主机的应用程序级别后处理
  4. 基于主机的队列级别后处理

如果基于队列级别主机的预执行处理失败,那么将不会执行基于应用程序级别主机的预执行处理。 如果基于主机的预执行处理失败,那么将不会执行任何其他基于作业的预执行处理。 如果基于主机的执行前处理失败,或者作业失败,那么仍将执行基于主机的执行后处理以执行任何清除活动。 执行结果将作为后处理结果报告给 管理 主机,并由 bhist显示。 如果基于应用程序级别主机的执行后处理失败,那么仍将执行基于队列级别主机的执行后处理。

基于作业的执行前处理的命令行为

执行前命令通过退出状态将信息返回到 LSFLSF 在队列中保留该作业,直到指定的预执行命令返回零(0)退出代码。 如果预执行命令退出时返回非零值,则作业将挂起,直到 LSF 再次尝试调度它。 当该任务仍处于 “等待”状态时, LSF 会将其他任务发送给执行主机。

如果执行前命令以值 99 退出,那么作业将退出而不处于暂挂状态。 这允许您在执行前命令失败时取消作业。

如果 lsb.applicationslsb.queues 中的 PRE_EXEC=$USER_PREEXEC ,UNIX用户可自定义预执行命令:
setenv USER_PREEXEC /path_name
其中,预执行命令的路径名是绝对路径。

必须确保预执行命令运行时不会产生副作用; 即,您应该定义不会干扰作业本身的预执行命令。 例如,如果使用预执行命令来预留资源,那么在作业提交过程中也不能预留相同的资源。

LSF 用户在提交作业时可以指定一个预执行命令。 LSF 首先找到一个合适的宿主来运行作业,然后在宿主上运行预执行命令。 如果预执行命令成功运行并返回退出代码为零,则 LSF 将运行该作业。

基于作业的执行后处理的命令行为

执行后命令在作业完成后运行,而不考虑作业的退出状态。 一旦执行后命令与作业相关联,即使该作业失败,该命令也会运行。 不能将执行后命令配置为仅在特定条件下运行。

作业资源使用量计算中不包括执行后处理资源使用量,执行后命令退出代码也不会报告给 LSF

如果 POST_EXEC= lsb.applicationslsb.queues中的$USER_POSTEXEC ,那么 UNIX 用户可以定义自己的执行后命令:
setenv USER_POSTEXEC /path_name

其中执行后命令的路径名是绝对路径。


如果 POST_EXEC=$USER_POSTEXEC 并且 ... 然后
用户定义 USER_POSTEXEC 环境变量
  • LSF 运行由环境变量USER_POSTEXEC 定义的执行后命令
  • 用户自定义命令运行后, LSF 会报告执行后处理成功完成
  • 如果用户自定义命令失败, LSF 会报告执行后处理失败
用户未定义 USER_POSTEXEC 环境变量
  • LSF 报告执行后的成功处理,而无需实际运行执行后的命令

重要 :当执行前和执行后命令设置为以根账户运行时,不允许用户指定执行后命令。

基于主机的执行前和执行后处理的命令执行

在开始基于主机的执行前和执行后处理之前,会将为作业执行设置的所有环境变量传递到所有执行主机并对其进行设置。

缺省情况下,基于主机的执行前和执行后处理在提交作业的用户的帐户下运行。 要在队列级别的其他用户帐户 (例如,特权操作的 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