Skip to main content

控制作业

LSF

常用控制命令

命令 功能
bjobs 查看自己未结束的作业
bjobs -l JOBID 查看某个未结束作业的详情
bhist 查看自己已结束的历史作业
bhist -l JOBID 查看某个已结束历史作业的详情
bpeek JOBID 查看正在运行某个作业的stdout/stderr
bkill JOBID 终止某个作业
btop JOBID 设置作业最先运行
bbot JOBID 设置作业最后运行

作业状态

bjobs命令的作业状态可能值包括:

状态 描述
PEND 作业正在等待中。也就是说,作业尚未开始。
PROV 作业已被派发到一个正在唤醒的节能状态主机。在作业可以发送到
sbatchd之前,它处于PROV状态。
PSUSP 作业在等待期间被挂起,可能是作业所有者或LSF管理员操作的。
RUN 作业当前正在运行。
USUSP 作业在运行期间被挂起,可能是作业所有者或LSF管理员操作的。
SSUSP 作业被LSF挂起。
DONE 作业以状态0终止。
EXIT 作业以非零状态终止。
UNKWN 一般是两种情况之一,如果作业状态长时间处于UNKWN状态,一般来
说就是计算节点坏了可以直接杀掉作业。①因为计算节点负载过高,未
能及时获取作业状态导致状态未知,这种情况一般只需要等待即可,待
负载下降获取状态后就正常了。②因为计算节点出现故障且长时间未恢
复,调度系统无法获取作业状态,此时如果登录不到相应的计算节点,
可以直接杀掉作业。
WAIT 对于提交到块作业队列的作业,块作业中的成员正在等待运行。
ZOMBI ①当sbatchd在执行主机上不可达时,非可重新运行的作业被bkill杀死,
并且作业显示为UNKWN。 ②运行可重新运行作业的主机不可用,并且LSF
已将作业重新排队,分配了新的作业ID,就像提交了新作业一样。 ③在执
行主机可用之后,LSF尝试杀死ZOMBI作业。ZOMBI作业成功终止后,作业
的状态将更改为EXIT。 使用MultiCluster时,当在远程执行群集上运行的作
业变为ZOMBI作业时,执行群集将像本地ZOMBI作业一样处理该作业。此外,
它还会通知提交群集作业处于ZOMBI状态,并且提交群集将重新排队作业。

作业等待

bwait -w "wait_condition" [-t timeout]

暂停并等待作业条件满足,不满足一直暂停等待,满足则执行完毕返回。

典型用法:在脚本中不要循环使用bjobs判断作业状态,而用bwait等待作业运行完成,这样更优雅且能显著降低对集群的压力。

  • -w wait_condition:要满足的等待条件,此表达式与上述bsub -w选项的格式相同。
  • -t timeout:等待条件的超时,范围为1-525600分钟,默认为一年。

Slurm

常用控制命令

命令 功能
squeue --me (或 squeue -u $USER) 查看自己正在排队或运行的未结束作业
scontrol show job JOBID 查看某个未结束作业的详细配置(如分配节点、环境变量、资源限制等)
sacct 查看自己历史作业的简要信息
sacct -j JOBID -l 查看某个已结束历史作业的详细统计信息(包括内存峰值、CPU使用效率、退出状态等)
tail -f slurm-JOBID.out 查看正在运行作业的标准输出(注:Slurm 没有直接对应的 bpeek,通常直接查看其定义的输出文件即可)
scancel JOBID 终止某个作业
scancel -u $USER 终止属于该用户的所有作业(排队与运行中的)
scontrol top JOBID 请求将处于排队状态的作业置于队列顶部(需系统配置允许,仅影响自己的作业优先级排序)
scontrol hold JOBID 挂起作业(暂停排队)
scontrol release JOBID 解除挂起(允许作业继续排队调度)

作业状态

squeuesacct 命令输出中的状态标识(通常简写为两个字母)可能包括以下常见值:

状态 (简写) 描述
PENDING (PD) 作业正在等待资源分配。即作业仍在排队中尚未开始。
CONFIGURING (CF) 资源已被分配,但计算节点正在启动或配置环境(例如从节能模式唤醒)。
RUNNING (R) 作业当前正在计算节点上运行。
COMPLETING (CG) 作业正在结束,系统正在回收资源和清理进程。
COMPLETED (CD) 作业以状态 0 成功终止(所有进程均正常退出)。
FAILED (F) 作业以非零状态终止,或其他严重错误导致运行失败。
CANCELLED (CA) 作业被用户或管理员手动取消(如使用 scancel 命令)。
TIMEOUT (TO) 作业运行时间超过了申请的限制时间 (-t),被调度器强制终止。
OUT_OF_MEMORY (OOM) 作业使用的内存超出了申请的上限,被系统内核 OOM Killer 杀掉。
SUSPENDED (S) 作业在运行期间被挂起。通常是因为高优先级作业抢占资源,或管理员手动操作。
NODE_FAIL (NF) 作业所在节点发生硬件故障或失联导致作业非正常终止。
UNKNOWN (UN) 调度系统无法获取作业状态。一般是因为计算节点长时间故障或与控制节点断开连接。此时如果登不上计算节点,可以直接 scancel 杀掉作业。

作业等待与依赖控制

在 LSF 中存在独立的 bwait 工具。在 Slurm 中,严禁在 Shell 脚本中使用 while 循环加 squeue 的方式高频轮询作业状态,这会对调度器数据库造成灾难性的压力。

请使用以下优雅的标准替代方案:

提交并阻塞等待 (--wait)

如果你希望在终端或外部脚本中提交作业后挂起,直到该作业执行完毕才继续往下走,请在提交时添加 -W, --wait 选项:

sbatch -W job.slurm

此命令会一直挂起,直到 job.slurm 执行完毕(无论成功或失败)才会返回终端提示符。

利用调度器依赖树 (--dependency)

如果你有一个作业 B 必须在作业 A 完成后才能运行,应在提交作业 B 时声明依赖关系交由系统管理:

# 假设提交作业 A 后返回的 JOBID 为 10001
sbatch --dependency=afterok:10001 job_B.slurm

作业 B 会被调度器以 Dependency 的原因置于 PENDING 状态。作业 A 成功结束后,B 才会开始参与资源调度分配。

脚本中等待已经运行的作业 (伪作业阻塞法)

如果确实需要在一个独立的 Shell 脚本中阻塞等待一个已经提交并正在运行的作业(例如 JOBID 10001)结束,可以向系统提交一个零操作的极轻量级伪作业,并配合 --wait

sbatch -W --dependency=afterany:10001 --wrap="exit 0"

此时当前 Shell 脚本将暂停。一旦 10001 结束,这个包装作业会被立刻触发执行并瞬间结束,Shell 脚本随之恢复运行。这完美替代了 bwait 功能且对集群完全无害。