作业依赖 (Job Dependency)¶
功能概述¶
CraneSched-FrontEnd 的 dependency 功能允许作业根据其他作业的状态来控制执行时机,实现作业间的依赖管理。通过依赖关系,可以构建复杂的工作流,确保作业按照正确的顺序执行。
支持的命令¶
dependency 功能在以下命令中可用:
cbatch- 批处理作业提交calloc- 交互式资源分配crun- 交互式作业运行
命令行参数¶
在提交作业时使用 --dependency 或 -d 参数指定依赖关系。
依赖字符串格式¶
基本语法¶
依赖类型¶
| 类型 | 说明 | 触发条件 |
|---|---|---|
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:SS 或 D-HH:MM:SS 格式(如 01:30:00 或 1-01:30:00)。冒号 : 字符被保留用作作业 ID 分隔符,因此这类格式会被误解析为多个作业 ID,而不是延迟时间。这可能导致"重复作业"错误,或者静默成功但产生完全错误的依赖行为。请始终使用带单位的时间格式(如 90m 或 1h30m)。
多依赖组合¶
AND 逻辑(所有条件都满足)¶
使用 , 分隔不同的依赖条件:
作业会等待作业 100 开始 并且 作业 101 成功完成。
OR 逻辑(任一条件满足)¶
使用 ? 分隔不同的依赖条件:
作业会在作业 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> 命令查看作业的依赖状态:
输出示例¶
依赖状态字段说明¶
| 字段 | 说明 |
|---|---|
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:01 或 after: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