bsub命令速查
一、bsub 命令概述
bsub 是 LSF(Load Sharing Facility)作业管理系统的核心命令,用于向集群提交作业。提交作业时需要声明资源需求(CPU、内存、运行时间等)和执行内容(命令或脚本),LSF 负责在合适的节点上调度执行。
二、bsub 选项速查表
2.1 资源需求类
| 选项 | 说明 | 示例 |
|---|---|---|
-n N |
请求 N 个 CPU 核心(slot) | bsub -n 8 ./myjob |
-n N,M |
最少 N 个,最多 M 个核心 | bsub -n 4,8 ./myjob |
-R "rusage[mem=M]" |
每个核心预留 M MB 内存 | bsub -R "rusage[mem=4096]" ./myjob |
-R "rusage[mem=M1:mem=M2]" |
多个节点的不同内存需求 | bsub -R "rusage[mem=4096:mem=8192]" |
-R "rusage[swp=S]" |
每个核心预留 swap 空间 | bsub -R "rusage[swp=2048]" |
-R "rusage[tmp=T]" |
每个核心预留 /tmp 空间 |
bsub -R "rusage[tmp=10240]" |
-R "select[expr]" |
节点选择条件 | bsub -R "select[os==linux64]" |
-R "order[expr]" |
节点排序条件 | bsub -R "order[r15s]" |
-R "span[ptile=N]" |
每个节点最多分配 N 个核心 | bsub -R "span[ptile=4]" |
-R "span[hosts=1]" |
所有核心必须在同一节点 | bsub -R "span[hosts=1]" |
-R "affinity[core]" |
启用 CPU 亲和性绑定 | bsub -R "affinity[core]" |
-M M |
作业总内存上限(MB),超限即 kill | bsub -M 8192 ./myjob |
-W HH:MM |
作业 walltime 上限,超时自动终止 | bsub -W 12:00 ./myjob |
-W [HH:]MM |
分钟格式的时间上限 | bsub -W 120 ./myjob |
-c CPU_Time/Host_Time |
CPU 时间上限(格式同上) | bsub -c 10:00/12:00 |
-app app_profile |
使用预定义的应用资源模板 | bsub -app fluent ./myjob |
-gpu - |
请求 GPU 资源 | bsub -gpu - -n 4 ./myjob |
-gpu "num=2:mode=exclusive_process" |
请求 2 个 GPU,独占模式 | bsub -gpu "num=2:mode=exclusive_process" |
-m "hostA hostB" |
指定候选节点列表 | bsub -m "node01 node02" ./myjob |
-x |
独占执行节点(整个节点只跑此作业) | bsub -x -n 16 ./myjob |
-R "type==TYPE" |
指定节点资源类型 | bsub -R "type==any" |
2.2 输出与日志类
| 选项 | 说明 | 示例 |
|---|---|---|
-o file |
标准输出重定向到文件(追加) | bsub -o output.log ./myjob |
-e file |
标准错误重定向到文件(追加) | bsub -e error.log ./myjob |
-oo file |
标准输出重定向到文件(覆盖) | bsub -oo output.log ./myjob |
-eo file |
标准错误重定向到文件(覆盖) | bsub -eo error.log ./myjob |
-J "job_name" |
作业名称(最多 4094 字符) | bsub -J "top_sim_v2" ./myjob |
-J "name[1-100]" |
作业数组名称 | bsub -J "myarray[1-100]" |
-N |
作业完成后发邮件通知 | bsub -N -u user@company.com ./myjob |
-u addr |
指定邮件通知地址 | bsub -u user@company.com ./myjob |
-B |
作业开始运行时发邮件通知 | bsub -B -N ./myjob |
-f "file1 > file2" |
文件传输(作业完成后复制文件到指定位置) | bsub -f "result.log > /shared/result.log" |
输出文件名中的特殊变量:
| 变量 | 含义 |
|---|---|
%J |
作业 ID |
%I |
作业数组索引(仅在作业数组中有效) |
%JG |
作业组名(如果指定了 -g) |
%P |
作业所运行的队列名 |
2.3 依赖关系类
| 选项 | 说明 | 示例 |
|---|---|---|
-w "done(id)" |
只有前驱作业成功完成才运行 | bsub -w "done(12345)" ./myjob |
-w "ended(id)" |
前驱作业结束(无论成败)即运行 | bsub -w "ended(12345)" ./myjob |
-w "exit(id)" |
前驱作业以退出码 0 结束才运行 | bsub -w "exit(12345)" ./myjob |
-w "done(id) && done(id2)" |
多个依赖 AND 逻辑 | bsub -w "done(12345) && done(12346)" |
-w "done(id) || done(id2)" |
多个依赖 OR 逻辑 | bsub -w "done(12345) || done(12346)" |
-w "numdone(job_name, N)" |
数组作业中至少 N 个完成 | bsub -w "numdone(myarray, 5)" |
-w "numended(job_name, N)" |
数组作业中至少 N 个结束 | bsub -w "numended(myarray, 5)" |
-ti |
作业依赖终止时间,超时自动取消依赖 | bsub -ti 3600 -w "done(12345)" |
2.4 队列与项目类
| 选项 | 说明 | 示例 |
|---|---|---|
-q queue_name |
指定提交队列 | bsub -q normal ./myjob |
-q "q1 q2" |
指定多个候选队列(按顺序尝试) | bsub -q "normal priority" ./myjob |
-P project_name |
指定项目名(用于计费和统计) | bsub -P "chip_tapout" ./myjob |
-G group_name |
指定用户组(用于 Fairshare) | bsub -G "cad_group" ./myjob |
-g job_group |
指定作业组名 | bsub -g "/groupA/subgroup" ./myjob |
-sla sla_name |
指定 SLA(服务等级协议) | bsub -sla gold ./myjob |
2.5 作业控制类
| 选项 | 说明 | 示例 |
|---|---|---|
-I |
交互式提交:阻塞,输出直接到终端 | bsub -I ./short_test |
-Is |
交互式 Shell:获得执行节点的伪终端 | bsub -Is /bin/bash |
-Ip |
交互式提交,但输出不打印到终端 | bsub -Ip ./myjob |
-K |
提交后等待完成,返回作业退出码 | bsub -K ./myjob |
-H |
以 HOLD 状态提交(需手动释放) | bsub -H ./myjob |
-p priority |
设置作业优先级(数值越大越高) | bsub -p 100 ./myjob |
-r |
作业可被 rerun(节点故障时自动重跑) | bsub -r ./myjob |
-rn |
作业不可被 rerun | bsub -rn ./myjob |
-L login_shell |
指定提交时的登录 shell | bsub -L /bin/tcsh ./myjob |
-C core_limit |
设置 core dump 文件大小上限 | bsub -C 1024 ./myjob |
-Ep cmd |
作业开始前在提交节点执行的命令 | bsub -Ep "cp data.in /tmp/" ./myjob |
-Ee cmd |
作业结束后在提交节点执行的命令 | bsub -Ee "mail -s done user@co.com" ./myjob |
2.6 环境与输入类
| 选项 | 说明 | 示例 |
|---|---|---|
-i file |
从文件读取标准输入 | bsub -i input.txt ./myjob |
-is file |
从文件读取标准输入(输入文件不随作业移动) | bsub -is input.txt ./myjob |
-env "VAR1=val1 [VAR2=val2]" |
传递环境变量 | bsub -env "PATH=/tools/bin:$PATH" |
-F file |
指定作业文件(脚本),与 < 等价 |
bsub -F job_script.sh |
-Zs |
使用安全提交模式,不继承环境变量 | bsub -Zs < job_script.sh |
2.7 作业数组类
| 选项 | 说明 | 示例 |
|---|---|---|
-J "name[start-end[:step]]" |
定义作业数组 | bsub -J "scan[1-100:2]" |
-J "name[1,5,10,15]" |
指定索引列表 | bsub -J "scan[1,5,10,15]" |
-t N |
作业数组并发限制(同时最多 N 个运行) | bsub -J "scan[1-100]" -t 10 |
%I |
在命令中引用当前索引 | bsub -J "scan[1-100]" -o "out.%I" |
%J |
在命令中引用作业 ID | bsub -J "scan[1-100]" -o "out.%J.%I" |
$LSB_JOBINDEX |
脚本中获取当前索引(环境变量) | echo "Index: $LSB_JOBINDEX" |
2.8 高级选项
| 选项 | 说明 | 示例 |
|---|---|---|
-ar time |
指定作业的自动释放时间 | bsub -ar "2026-08-04T08:00:00" |
-b time |
指定作业开始时间(延迟提交) | bsub -b "02:00" ./myjob |
-ext "sched=pref[resource]" |
调度偏好扩展 | bsub -ext "sched=pref[license]" |
-R "license[lic1=N]" |
请求 N 个 License 资源 | bsub -R "license[synopsys=2]" |
-stage |
作业文件暂存模式 | bsub -stage ./myjob |
-data |
数据暂存 | bsub -data "file_a" ./myjob |
-jsdl file |
使用 JSDL 文件描述作业 | bsub -jsdl job.xml |
-jsdl_strict file |
严格 JSDL 模式 | bsub -jsdl_strict job.xml |
三、bsub 脚本内嵌指令(#BSUB)
在作业脚本中通过 #BSUB 注释行声明选项,与命令行选项功能完全一致:
#!/bin/bash
#BSUB -J top_simulation
#BSUB -q normal
#BSUB -n 16
#BSUB -R "rusage[mem=8192] span[hosts=1]"
#BSUB -W 24:00
#BSUB -o /shared/logs/%J.out
#BSUB -e /shared/logs/%J.err
#BSUB -N
#BSUB -u engineer@company.com
#BSUB -P chip_project
cd /shared/workdir
source /tools/setup.sh
./run_simulation --input testcase.v --output results/
提交方式:
# 方式一:重定向
bsub < job_script.sh
# 方式二:-F 选项
bsub -F job_script.sh
注意: #BSUB 指令必须从行首开始,#BSUB 与选项之间至少有一个空格。脚本开头的 #!/bin/bash 是必须的(或其他有效的 shell 解释器)。
四、配套管理命令详解
4.1 bjobs — 查看作业状态
这是日常使用频率最高的命令。
基础用法:
bjobs # 查看当前用户的所有作业(简要)
bjobs -a # 查看所有作业(包括近期完成的)
bjobs -p # 只显示 PEND(等待中)的作业
bjobs -r # 只显示 RUN(运行中)的作业
bjobs -d # 只显示 DONE(已完成)的作业
bjobs -s # 只显示 SUSP(挂起)的作业
bjobs -u username # 查看指定用户的作业
bjobs -u all # 查看所有用户的作业
bjobs -q queue_name # 查看指定队列中的作业
bjobs -J job_name # 按作业名搜索
bjobs -m hostname # 查看运行在指定节点上的作业
详细信息:
bjobs -l 12345 # 查看作业 12345 的完整详细信息
bjobs -l -p # 查看所有 PEND 作业的详细信息
bjobs -l -u username # 查看指定用户作业的详细信息
bjobs -l 输出解读:
Job <12345>, Job Name <top_sim>, User <engineer>, Project <chip_project>
Queue <normal>, Job Priority <50>
...
PENDING REASONS:
Load information unavailable on some hosts; # 调度器在收集节点信息
Not enough of the right type of hosts available; # 没有满足条件的节点
# (资源不够或类型不匹配)
PEND 原因常见类型:
| 原因 | 含义 |
|---|---|
Not enough of the right type of hosts available |
满足条件的节点不够 |
Not enough processors |
空闲 CPU 核心不够 |
Not enough memory |
空闲内存不够 |
License not available |
请求的 License 不可用 |
User has reached the job slot limit |
用户作业槽位达到上限 |
Job slot limit reached |
队列或主机作业槽位上限 |
Waiting for dispatch |
正在等待被调度 |
Dependency condition has not been satisfied |
依赖作业未完成 |
Job held by user |
作业被用户 HOLD |
格式化输出:
bjobs -o "jobid stat user queue job_name start_time finish_time" # 自定义列
bjobs -o "jobid stat user queue job_name submit_time pend_reason" -p # 查看 PEND 原因
bjobs -o "jobid:7 stat:4 user:10 queue:10 job_name:20" # 自定义列宽
可用字段(部分常用):
jobid, stat, user, queue, job_name, project_name, submit_time, start_time, finish_time, run_time, cpu_used, mem, max_mem, swap, max_swap, slot, exec_host, pend_reason, exit_code, from_host, command
作业数组查看:
bjobs -J "myarray[1-100]" # 查看数组所有元素
bjobs -J "myarray[1-100]" -l # 查看数组详细信息
bjobs -A # 按数组汇总显示
4.2 bkill — 终止作业
bkill 12345 # 终止作业 12345(发送 SIGTERM 再 SIGKILL)
bkill -r 12345 # 终止作业并向提交节点发送通知
bkill -s SIGKILL 12345 # 立即强制终止(不发送 SIGTERM)
bkill -s SIGUSR1 12345 # 发送自定义信号
bkill -b 12345 # 终止 + 发邮件通知
bkill 0 # 终止当前用户的所有作业
bkill -u username 0 # 终止指定用户的所有作业(需管理员权限)
bkill -J "job_name" 0 # 终止指定名称的所有作业
bkill -q queue_name 0 # 终止指定队列中的所有作业
bkill -g "/group_name" 0 # 终止指定作业组的所有作业
bkill -J "myarray[1-100]" 0 # 终止整个作业数组
bkill -J "myarray[1-100]" 5 # 终止数组索引 5
4.3 bhist — 查看作业历史
bhist # 查看近期作业历史(简要)
bhist -a # 查看所有作业历史
bhist -l 12345 # 查看作业 12345 的详细历史
bhist -l -n 50 # 查看最近 50 条历史
bhist -d # 只显示已完成的作业
bhist -e # 只显示异常的作业
bhist -u username # 查看指定用户的历史
bhist -t 2026/08/01 # 从指定日期开始查看
bhist -S 2026/08/01 # 查看指定日期之后的作业
bhist -E 2026/08/03 # 查看指定日期之前的作业
bhist -S 2026/08/01 -E 2026/08/03 # 查看指定日期范围的作业
bhist -c 30:00 # 查看 CPU 耗时超过 30 小时的作业
bhist -w # 宽格式输出
bhist -l 输出关键信息:
Job <12345>, User <engineer>, Project <chip_project>, Status <DONE>
Queue <normal>, Command <./run_sim.sh>
Submit Time <Mon Aug 3 09:00:00 2026>
Start Time <Mon Aug 3 09:05:23 2026>
Finish Time <Mon Aug 3 15:30:45 2026>
Run Time <06:25:22>
CPU Time <102.5 hours> (多核累计)
Max Memory <7.2 GB> (峰值内存)
Max Swap <0.5 GB>
Exit Code <0>
4.4 bhosts — 查看节点状态
bhosts # 查看所有节点状态(简要)
bhosts -l node01 # 查看节点 node01 的详细信息
bhosts -l # 查看所有节点的详细信息
bhosts -w # 宽格式输出
bhosts -o "host_name status njobs maxmem maxswp nprocs" # 自定义列
bhosts -R "type==linux64" # 按资源类型筛选
bhosts -m node01 node02 node03 # 只查看指定节点
bhosts -X # 显示节点状态变更时间
节点状态含义:
| 状态 | 含义 |
|---|---|
ok |
正常可用,可以接受作业 |
closed |
管理员关闭,不接受新作业,但已有作业继续运行 |
unavail |
不可用(LIM 未响应或宕机) |
unreach |
网络不可达 |
closed_Full |
节点资源已满 |
closed_Busy |
节点负载过高 |
closed_Excl |
被独占作业占用 |
closed_LIM |
LIM 进程异常 |
closed_Adm |
管理员手动关闭 |
closed_Wind |
正在关闭窗口中(等待作业完成) |
closed_Unlic |
缺少 License |
bhosts -l 输出关键信息:
HOST_NAME: node01
STATUS: ok
type model nprocs ncpus ncores nthreads
X86_64 Intel_E5 16 16 16 32
LOAD:
r15s r1m r15m ut pg io ls it tmp swp mem
0.5 0.8 0.6 5% 0.0 50 10 0 100G 20G 50G
- r15s/r1m/r15m:15 秒/1 分钟/15 分钟平均负载
- ut:CPU 利用率
- mem:总内存
- swp:总 swap
- tmp:
/tmp可用空间 - pg:换页速率
- io:磁盘 IO 速率
4.5 bqueues — 查看队列配置
bqueues # 查看所有队列(简要)
bqueues -l normal # 查看 normal 队列的详细配置
bqueues -l # 查看所有队列的详细配置
bqueues -u username # 查看用户可用的队列
bqueues -m node01 # 查看覆盖 node01 的队列
bqueues -l 输出关键配置项:
| 配置项 | 含义 |
|---|---|
PRIORITY |
队列优先级 |
NICE |
优先级调整值 |
MAX_JOBS |
最大作业数 |
UJOB_LIMIT |
每用户最大作业数 |
PJOB_LIMIT |
每处理器最大作业数 |
RUNLIMIT |
作业运行时间上限 |
PROCLIMIT |
每作业处理器数上限 |
MEMLIMIT |
每作业内存上限 |
SWAPLIMIT |
每作业 swap 上限 |
USERS |
允许的用户列表 |
HOSTS |
队列覆盖的节点 |
PREEMPTION |
抢占策略 |
FAIRSHARE |
公平共享策略 |
CHUNK_JOB_SIZE |
作业块大小 |
ADMINISTRATORS |
队列管理员 |
PRE_EXEC |
作业执行前运行的命令 |
POST_EXEC |
作业执行后运行的命令 |
REQUEUE_EXIT_VALUES |
触发重新排队的退出码 |
JOB_STARTER |
作业启动器 |
4.6 bpeek — 实时查看作业输出
bpeek 12345 # 查看作业 12345 的当前输出
bpeek -f 12345 # 持续查看(类 tail -f),Ctrl+C 退出
bpeek -f -n 100 12345 # 持续查看,初始显示最后 100 行
bpeek -o 12345 # 查看标准输出
bpeek -e 12345 # 查看标准错误
注意: bpeek 只能查看正在运行的作业。对于已完成的作业,直接查看 -o/-e 指定的日志文件。
4.7 bacct — 作业资源统计
bacct 12345 # 查看作业 12345 的资源使用统计
bacct -l 12345 # 详细统计
bacct -u username # 按用户统计
bacct -P project_name # 按项目统计
bacct -q queue_name # 按队列统计
bacct -C 2026/08/01 # 从指定日期开始统计
bacct -D 7 # 最近 7 天的统计
bacct -S 2026/08/01 -E 2026/08/03 # 指定日期范围
bacct -l 输出关键信息:
Accounting information about Job <12345>:
CPU_T: 102.5 hours (总 CPU 时间)
MEM: 7.2 GB (峰值内存)
SWAP: 0.5 GB (峰值 swap)
RUN_TIME: 6.4 hours (walltime)
TURNAROUND: 6.5 hours (从提交到完成的总时间)
EXIT_CODE: 0
4.8 bresize — 调整运行中作业的资源
bresize -n 16 12345 # 将作业 12345 的核心数调整为 16
bresize -W 48:00 12345 # 将 walltime 延长到 48 小时
bresize -M 16384 12345 # 调整内存上限
bresize -R "rusage[mem=8192]" 12345 # 调整资源需求
bresize -gpu "num=2" 12345 # 调整 GPU 需求
注意: 通常只能扩大,不能缩小;且受限于管理员配置和当前可用资源。
4.9 bstop / bresume — 挂起与恢复作业
bstop 12345 # 挂起作业 12345
bstop -J "myarray" 0 # 挂起整个作业数组
bresume 12345 # 恢复作业 12345
bresume -J "myarray" 0 # 恢复整个作业数组
4.10 btop / bbot — 调整作业优先级
btop 12345 # 将作业 12345 移到队列顶部
bbot 12345 # 将作业 12345 移到队列底部
btop -u username 0 # 将某用户所有作业移到顶部
bbot -u username 0 # 将某用户所有作业移到底部
4.11 bswitch — 切换作业队列
bswitch normal 12345 # 将作业 12345 切换到 normal 队列
bswitch -J "myarray" normal 0 # 将整个数组切换到 normal 队列
4.12 bmod — 修改作业参数
bmod -J "new_name" 12345 # 修改作业名称
bmod -q normal 12345 # 修改队列
bmod -W 48:00 12345 # 修改 walltime(仅 PEND 状态可用)
bmod -n 16 12345 # 修改 CPU 核心数(仅 PEND 状态)
bmod -R "rusage[mem=16384]" 12345 # 修改资源需求
bmod -Z "new_cmd" 12345 # 修改作业命令
bmod -ar "2026-08-04T08:00:00" 12345 # 修改自动释放时间
bmod -N -u user@co.com 12345 # 修改邮件通知
bmod -H -r 12345 # 取消 HOLD 状态并释放作业
4.13 bsub 相关信息查询命令
bparams # 查看 LSF 配置参数
bparams -l # 详细配置
bparams -a # 查看所有配置
lshosts # 查看集群中所有主机的静态资源信息
lshosts -l node01 # 查看 node01 的静态资源详情
lsload # 查看集群中所有主机的动态负载信息
lsload -l node01 # 查看 node01 的动态负载详情
lsload -I 5 # 每 5 秒刷新一次
lsid # 查看 LSF 集群名称和 Master 节点
lsclusters # 查看所有 LSF 集群
lsinfo # 查看 LSF 系统和安装信息
lsmon # 查看 LSF 守护进程状态
bconf # 查看 LSF 配置
badmin # 查看集群管理信息
badmin showconf # 查看完整配置
badmin showstatus # 查看集群运行状态
badmin ckconfig # 检查配置一致性
badmin reconfig # 重新加载配置(需管理员权限)
busers # 查看用户资源使用统计
busers -l # 详细信息
busers -w # 宽格式
busers all # 查看所有用户的统计
bapp # 查看所有应用模板
bapp -l fluent # 查看 fluent 应用模板详情
blicenses # 查看 License 资源状态
blicenses -l synopsys # 查看 synopsys License 详情
4.14 作业组管理
bjgroup -s /group_name # 查看作业组状态
bjgroup -l /group_name # 详细作业组信息
bgadd /group_name # 创建作业组
bgdel /group_name # 删除作业组
bgmod /group_name # 修改作业组
五、作业状态完整生命周期
┌──────────────────────────────────────┐
│ PEND │
│ (等待调度,排队中) │
│ PEND 原因包括: │
│ - 资源不足 │
│ - 依赖未满足 │
│ - 用户/管理员 HOLD │
│ - 队列/用户槽位已满 │
└──────────┬───────────────────────────┘
│ 调度器分配资源
▼
┌──────────────────────────────────────┐
│ RUN │
│ (正在执行节点上运行) │
│ │
│ 可能的中断状态: │
│ - PSUSP (管理员挂起) │
│ - USUSP (用户挂起) │
│ - SSUSP (系统自动挂起) │
│ - WAIT (等待 dispatch) │
└──────────┬───────────────────────────┘
│
┌──────────┴───────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ DONE │ │ EXIT │
│ (正常完成) │ │ (异常退出) │
│ exit code == 0 │ │ exit code != 0 │
└──────────────────┘ └──────────────────┘
│
┌──────────┴───────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ ZOMBI │ │ UNKWN │
│ (已被 kill │ │ (状态未知) │
│ 但还在清理) │ │ Master 联系不上 │
└──────────────────┘ │ 执行节点) │
└──────────────────┘
状态速查:
| 状态 | 含义 |
|---|---|
PEND |
等待调度 |
RUN |
正在运行 |
DONE |
正常完成 |
EXIT |
异常退出 |
PSUSP |
被管理员挂起(运行中) |
USUSP |
被用户挂起(运行中) |
SSUSP |
被系统自动挂起(如节点负载过高) |
WAIT |
等待 dispatch(已分配节点但未启动) |
ZOMBI |
僵尸状态(作业已终止但仍在清理) |
UNKWN |
状态未知(Master 与执行节点失联) |
六、典型使用场景与命令组合
场景一:提交一个 EDA 仿真作业
bsub -q normal \
-n 16 \
-R "rusage[mem=8192] span[hosts=1]" \
-R "license[synopsys=1]" \
-W 24:00 \
-J "top_sim_v2" \
-o /shared/logs/%J.out \
-e /shared/logs/%J.err \
-P chip_project \
-N -u engineer@company.com \
./run_simulation.sh
场景二:作业数组 — 参数扫描
# 提交 100 个任务,每个任务处理不同的输入文件
bsub -J "scan[1-100]" \
-n 4 \
-R "rusage[mem=4096]" \
-W 2:00 \
-o "scan_%I.out" \
-e "scan_%I.err" \
-t 10 \
./run_scan.sh \$LSB_JOBINDEX
# 脚本内使用:
# input_file="data_${LSB_JOBINDEX}.in"
# ./simulator --input $input_file
场景三:作业依赖链
# 先提交第一个作业
JOB1=$(bsub -J "compile" -n 4 -W 1:00 -o compile.out ./compile.sh | awk '/is submitted/{print $2}' | tr -d '<>')
echo "Compile job: $JOB1"
# 第二个作业依赖第一个
JOB2=$(bsub -J "simulate" -n 16 -W 12:00 -o sim.out \
-w "done($JOB1)" ./simulate.sh | awk '/is submitted/{print $2}' | tr -d '<>')
echo "Simulate job: $JOB2"
# 第三个作业依赖第二个
bsub -J "report" -n 1 -W 1:00 -o report.out \
-w "done($JOB2)" ./generate_report.sh
场景四:日常监控命令组合
# 查看自己有多少作业在跑、多少在排队
bjobs -u $USER -p -r | wc -l
# 查看所有 PEND 作业及其原因
bjobs -p -o "jobid:7 stat:4 queue:10 job_name:20 pend_reason"
# 查看哪些节点负载高
bhosts -o "host_name:10 status:6 njobs:6 r15s:6 r1m:6 r15m:6 mem:10"
# 找出自己占用资源最多的作业
bjobs -r -o "jobid:7 job_name:20 start_time:20 run_time:12"
# 实时监控某个作业
watch -n 5 'bjobs -l 12345 | grep -E "Status|PEND|RUN"'
场景五:批量终止和清理
# 终止所有 PEND 超过 24 小时的作业
bjobs -p -o "jobid" -u $USER | tail -n +2 | xargs bkill
# 终止所有某个队列的作业
bkill -q debug_queue 0
# 终止所有作业名包含 "test" 的作业
bjobs -J "test" -o "jobid" -u $USER | tail -n +2 | xargs bkill
# 终止所有 EXIT 状态失败的作业数组元素
bjobs -J "scan[1-100]" -o "jobid stat" | grep EXIT | awk '{print $1}' | xargs bkill
七、环境变量参考
LSF 在作业执行时会自动设置以下环境变量,可在作业脚本中直接使用:
| 环境变量 | 含义 |
|---|---|
$LSB_JOBID |
当前作业 ID |
$LSB_JOBINDEX |
作业数组中的索引(仅数组作业) |
$LSB_JOBNAME |
作业名称 |
$LSB_QUEUE |
作业所在队列 |
$LSB_PROJECT_NAME |
项目名称 |
$LSB_HOSTS |
分配给作业的主机列表 |
$LSB_MCPU_HOSTS |
主机及其分配的 CPU 核心数 |
$LSB_MAX_NUM_PROCESSORS |
请求的 CPU 核心数 |
$LSB_SUB_HOST |
提交作业的主机名 |
$LSB_SUB_USER |
提交作业的用户名 |
$LSB_EXEC_HOSTTYPE |
执行节点类型 |
$LSB_OUTPUTFILE |
标准输出文件路径 |
$LSB_ERRORFILE |
标准错误文件路径 |
$LSB_JOB_START_TIME |
作业开始时间 |
$LSB_SUB_COMMAND_LINE |
提交的完整命令行 |
$LSB_AFFINITY_HOSTFILE |
CPU 亲和性主机文件 |
八、常用命令速查(按使用频率排序)
| 频率 | 命令 | 用途 |
|---|---|---|
| ★★★★★ | bjobs |
查看作业状态 |
| ★★★★★ | bsub |
提交作业 |
| ★★★★ | bkill |
终止作业 |
| ★★★★ | bpeek |
查看运行中作业输出 |
| ★★★ | bhosts |
查看节点状态 |
| ★★★ | bhist |
查看作业历史 |
| ★★ | bqueues |
查看队列配置 |
| ★★ | bacct |
查看资源统计 |
| ★ | busers |
查看用户使用统计 |
| ★ | bswitch |
切换队列 |
| ★ | bmod |
修改作业参数 |
| ★ | bstop/bresume |
挂起/恢复作业 |
| ★ | btop/bbot |
调整优先级 |
| ★ | bresize |
调整运行中作业资源 |
九、排查问题常用流程
作业一直 PEND
# 1. 查看 PEND 原因
bjobs -l <jobid> | grep -A 20 "PENDING REASONS"
# 2. 检查节点状态
bhosts -l
# 3. 检查队列限制
bqueues -l <queue_name>
# 4. 检查自己是否达到槽位上限
busers -l $USER
# 5. 查看是否有依赖未满足
bjobs -l <jobid> | grep -i depend
作业运行失败
# 1. 查看退出码
bjobs -l <jobid> | grep -i exit
# 2. 查看错误日志
cat error.log
# 3. 查看历史记录
bhist -l <jobid>
# 4. 查看资源是否超限
bacct -l <jobid> | grep -E "MEM|SWAP|RUN_TIME"
节点异常
# 1. 查看哪些节点不可用
bhosts | grep -v ok
# 2. 查看节点详情
bhosts -l <hostname>
# 3. 查看节点负载
lsload <hostname>
# 4. 查看节点静态资源
lshosts -l <hostname>