跳转至

作业依赖 (Job Dependency)

功能概述

CraneSched-FrontEnd 的 dependency 功能允许作业根据其他作业的状态来控制执行时机,实现作业间的依赖管理。通过依赖关系,可以构建复杂的工作流,确保作业按照正确的顺序执行。

支持的命令

dependency 功能在以下命令中可用:

  • cbatch - 批处理作业提交
  • calloc - 交互式资源分配
  • crun - 交互式作业运行

命令行参数

--dependency, -d <dependency_string>

在提交作业时使用 --dependency-d 参数指定依赖关系。

依赖字符串格式

基本语法

<type>:<job_id>[+<delay>][:<job_id>[+<delay>]]...

依赖类型

类型 说明 触发条件
after 在指定作业开始或取消后启动 依赖作业脱离 Pending 状态
afterok 在指定作业执行成功后启动 依赖作业以退出码 0 完成
afternotok 在指定作业执行失败后启动 依赖作业以非 0 退出码完成(包括超时、节点错误等)
afterany 在指定作业结束后启动 依赖作业结束(无论成功或失败)

延迟时间 (delay)

可选的延迟参数,支持以下格式:

  • 纯数字(默认单位为分钟)
  • 示例:10 = 10分钟

  • 带单位的时间

  • s, sec, second, seconds - 秒
  • m, min, minute, minutes - 分钟
  • h, hour, hours - 小时
  • d, day, days - 天
  • w, week, weeks - 周

不支持的格式

不要使用 HH:MM:SSD-HH:MM:SS 格式(如 01:30:001-01:30:00)。冒号 : 字符被保留用作作业 ID 分隔符,因此这类格式会被误解析为多个作业 ID,而不是延迟时间。这可能导致"重复作业"错误,或者静默成功但产生完全错误的依赖行为。请始终使用带单位的时间格式(如 90m1h30m)。

多依赖组合

AND 逻辑(所有条件都满足)

使用 , 分隔不同的依赖条件:

after:100,afterok:101

作业会等待作业 100 开始 并且 作业 101 成功完成。

OR 逻辑(任一条件满足)

使用 ? 分隔不同的依赖条件:

afterok:100?afterok:101

作业会在作业 100 作业 101 任一成功完成后启动。

注意

不能在同一个依赖字符串中混用 ,?,系统会返回错误。

使用示例

1. 基本依赖

# 等待作业 100 开始后再运行
cbatch --dependency after:100 my_script.sh

# 等待作业 100 成功完成后再运行
cbatch --dependency afterok:100 my_script.sh

# 等待作业 100 失败后再运行
cbatch --dependency afternotok:100 my_script.sh

# 等待作业 100 完成后再运行(无论成功或失败)
cbatch --dependency afterany:100 my_script.sh

2. 带延迟的依赖

# 等待作业 100 成功完成后,延迟 30 分钟再运行
cbatch --dependency afterok:100+30 my_script.sh

# 等待作业 100 成功完成后,延迟 10 秒钟再运行
cbatch --dependency afterok:100+10s my_script.sh

# 延迟 1 小时 30 分钟(使用带单位的格式)
cbatch --dependency afterok:100+90m my_script.sh

3. 多依赖

# 等待作业 100 开始且作业 101、102 都成功完成
cbatch --dependency after:100,afterok:101:102 my_script.sh

# 等待作业 100 开始 10 分钟且作业 101 成功完成 30 分钟
cbatch --dependency after:100+10m,afterok:101+30m my_script.sh

# 等待作业 100 成功或作业 101 失败
cbatch --dependency afterok:100?afternotok:101 my_script.sh

# 等待作业 100、101 都成功完成后延迟 2 小时,或作业 102 开始后立即运行
cbatch --dependency afterok:100:101+2h?after:102 my_script.sh

4. 在批处理脚本中使用

在批处理脚本中也可以使用 #CBATCH 指令:

#!/bin/bash
#CBATCH --dependency afterok:100
#CBATCH --nodes 2
#CBATCH --time 1:00:00
#CBATCH --output job-%j.out

echo "This job starts after job 100 completes successfully"
# 你的作业代码

5. 在交互式命令中使用

# calloc 中使用依赖
calloc --dependency afterok:100 -n 4 -N 2

# crun 中使用依赖
crun --dependency after:100 -n 1 hostname

查看依赖状态

使用 ccontrol show job <job_id> 命令查看作业的依赖状态:

ccontrol show job 105

输出示例

JobId=105
...
Dependency=PendingDependencies=afterok:100+01:00:00 Status=WaitForAll

依赖状态字段说明

字段 说明
PendingDependencies 尚未触发的依赖条件
DependencyStatus 依赖满足状态(见下表)

依赖状态值

状态 说明
WaitForAll 等待所有依赖满足(AND 逻辑)
WaitForAny 等待任一依赖满足(OR 逻辑)
ReadyAfter <time> 将在指定时间后就绪
SomeFailed 某些依赖失败(AND 逻辑,无法满足)
AllFailed 所有依赖都失败(OR 逻辑,无法满足)

错误处理

系统会在以下情况返回错误:

错误情况 说明 示例
混用分隔符 不能同时使用 ,? afterok:100,afterok:101?afterok:102
格式错误 依赖字符串不符合语法规则 afterok:after100
延迟格式无效 延迟时间格式不正确 afterok:100+invalid
重复依赖 同一作业 ID 出现多次 afterok:100:100
作业 ID 不存在或已结束 依赖的作业不存在(运行时检查) afterok:99999
不支持的时间格式 在延迟中使用 : (被误解析为作业 ID) after:1+00:00:01after:1+00:00:02 (解析为多个作业 ID,可能报错也可能不报错)

错误示例

# 错误:混用 AND 和 OR 分隔符
$ cbatch --dependency afterok:100,afterok:101?afterok:102 job.sh

# 错误:延迟格式无效
$ cbatch --dependency afterok:100+invalid job.sh

# 错误:重复的作业 ID
$ cbatch --dependency afterok:100,afternotok:100 job.sh

# 错误:在延迟时间中使用冒号(会被误解析为作业 ID 分隔符)
$ cbatch --dependency after:1+00:00:01 job.sh
# 会被解析为:等待作业 1, 00, 00, 01
# 错误信息:"duplicate task 1 in dependencies"(作业 1 出现两次)

$ cbatch --dependency after:1+00:00:02 job.sh
# 会被解析为:等待作业 1, 00, 00, 02
# 可能提交成功但行为错误(等待作业 00 和 02,忽略了 1 秒延迟)

# 正确:始终使用带单位的时间格式
$ cbatch --dependency after:1+1s job.sh
$ cbatch --dependency after:1+2s job.sh

相关命令

  • cbatch - 提交批处理作业
  • crun - 运行交互式任务
  • calloc - 分配资源并创建交互式 Shell
  • cqueue - 查看作业队列状态
  • ccontrol - 控制作业和系统资源
  • ccancel - 取消作业