SOP — 作业级 TMPDIR 注入本地 scratch(/local_scratch/users)¶
主题目录:
lsf_ins/tmpdir_inject_20261008/|执行日期:2026-10-08|类型:C 类(改共享配置 + 改实现体)
一、背景¶
/local_scratch(阶段15,2026-10-07 纳管)已挂载、profile.d 已导出 LOCAL_SCRATCH,
但作业内 TMPDIR 仍为空:LSF 未把作业临时目录导出为环境变量,作业的临时文件因此落在
执行节点本地盘 /tmp,与 Slurm 侧「本地临时层承载作业临时数据」的口径不一致
(HANDOFF §3 #5;../local_scratch/SOP.md 第八章坑 1)。
Slurm 侧由 TaskProlog 注入,LSF 侧此前没有对应机制。
二、目标¶
| 项 | 目标态 |
|---|---|
作业内 TMPDIR |
/local_scratch/users/<jobID>.tmpdir(LSF 命名规则,见下) |
| 权限 / 属主 | 0700 / 作业执行用户(LSF 自动创建) |
| 生命周期 | 作业结束由 LSF 自动删除(实测确认,无需额外老化清理) |
| 幂等 | 部署器复跑零变更;--drift 全阶段无漂移 |
| 可迁移 | 路径经配置项 lsf.job_tmpdir 给出,不硬编码在实现体 |
机制来自官方 man lsf.conf(5)(本机 LSF_TOP/10.1/man/man5/lsf.conf.5):
LSB_JOB_TMPDIR=<dir>:LSF 在作业启动时于该目录下创建作业专属临时目录 (普通作业$LSB_JOB_TMPDIR/<jobID>.tmpdir;数组作业<arrayID>_<arrayIndex>.tmpdir), 属执行用户、权限 0700;LSB_SET_TMPDIR=Y:把上述路径导出为TMPDIR;- 生效方式:
bctrld restart sbd all(官方原文;重启 sbatchd,不影响 mbatchd)。
三、前置条件¶
/local_scratch已在执行节点挂载(阶段15,--drift含该阶段无漂移);- 无 RUN 作业(
bjobs -u all显示No unfinished job found)——重启 sbatchd 前必须确认; - 操作机对节点 root 免密可用;
ldapadmin可执行bctrld/badmin; - 配置文件含
lsf.job_tmpdir(本次新增,见 5.2)。
四、影响范围¶
- 主机:共享配置 1 处(
/data/nfs/lsf/lsf/conf/lsf.conf,NFS 上,6 台共享) - 6 台 sbatchd 重启(hpc-submit / lsf-master-01/02 / lsf-work-01~03)。
- 是否停服:不停服,只重启 sbatchd;无 RUN 作业时无影响(本次实测 6 台
done, 集群状态保持 3 台 workok+ 3 台closed_Full)。 - 回滚:还原
lsf.conf备份 + 再次bctrld restart sbd all;无需重启节点。
五、分步操作¶
实现体:deploy/lsf/stages/lsf_install.py(子步 C:lsf.conf 加固)、
deploy/lsf/utils/config_validate.py(配置校验)、deploy/lsf/config/lsf_deploy.yaml(配置项)。
步骤 1:备份(高危前置,实现体自动执行)¶
cp -a /data/nfs/lsf/lsf/conf/lsf.conf /data/nfs/lsf/lsf/conf/lsf.conf.bak.<时间戳>
预期:同目录出现 .bak.<时间戳>(属主 ldapadmin,与原文件一致)。实现体在追加前自动完成,
本次落 lsf.conf.bak.20261008-034607。
步骤 2:写入共享 lsf.conf(幂等)¶
grep -qF 'LSB_JOB_TMPDIR=/local_scratch/users' /data/nfs/lsf/lsf/conf/lsf.conf || \
echo 'LSB_JOB_TMPDIR=/local_scratch/users' >> /data/nfs/lsf/lsf/conf/lsf.conf
grep -qF 'LSB_SET_TMPDIR=Y' /data/nfs/lsf/lsf/conf/lsf.conf || \
echo 'LSB_SET_TMPDIR=Y' >> /data/nfs/lsf/lsf/conf/lsf.conf
坑 1:路径长度上限 256 字符(含 LSF 运行期生成的子目录与文件),故取短路径
/local_scratch/users,不要写成带用户名/日期的长路径。
坑 2:LSB_JOB_TMPDIR 不支持用户名占位符(仅支持 %H=首执行主机),
因此无法做成 Slurm 侧的 users/<用户>/<jobid> 两级布局;隔离靠目录 0700 + 属执行用户。
本机实测作业目录为 /local_scratch/users/1051.tmpdir、drwx------ root root。
坑 3:该参数由 sbatchd 读取,lsadmin reconfig / badmin mbdrestart 均不生效,
必须重启 sbatchd(见步骤 3)。
步骤 3:生效(高风险:重启 sbatchd)¶
# 门禁:有 RUN 作业即停手
su - ldapadmin -s /bin/bash -c "bash -lc 'bjobs -u all'"
# 生效(交互命令,逐台确认;非交互时用 yes 应答)
su - ldapadmin -s /bin/bash -c "bash -lc 'yes | bctrld restart sbd all'"
预期:逐台打印 Restart server batch daemon on <host> ...... done(本次 6 台全 done)。
失败判断:某台报错 → 该台 systemctl status lsfd,必要时 badmin hrestart <host> 后重试。
步骤 4:部署器复跑(幂等验收)¶
cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage install # 预期「零变更跳过」
.venv/bin/python main.py -c config/lsf_deploy.yaml --drift # 预期 rc=0、全阶段无漂移
六、验证¶
# 从提交节点提交作业,输出写共享路径(执行节点本地盘读不到)
ssh root@192.168.31.28 'source /data/nfs/lsf/lsf/conf/profile.lsf; \
bsub -q normal -o /data/nfs/lsf/tmpdir_after.out \
"echo TMPDIR=[\$TMPDIR]; [ -d \$TMPDIR ] && echo DIR_OK || echo DIR_MISSING; ls -ld \$TMPDIR; echo DONE"'
# 等作业 DONE 后读回
ssh root@192.168.31.28 'cat /data/nfs/lsf/tmpdir_after.out'
| 判据 | 期望(实测) |
|---|---|
TMPDIR |
/local_scratch/users/<jobID>.tmpdir(第 1 遍 1051 / 第 2 遍 1052) |
| 目录存在 | DIR_OK |
| 权限属主 | drwx------ 2 root root(0700) |
| 作业结束后清理 | ls -ld /local_scratch/users/1051.tmpdir → No such file or directory |
| 改动前对照(反例) | 改前同一作业输出 TMPDIR=[](判据可判失败) |
| 部署器幂等 | --stage install 复跑「零变更跳过」;--drift rc=0 |
七、回滚¶
- 还原共享配置:
cp -a /data/nfs/lsf/lsf/conf/lsf.conf.bak.<时间戳> /data/nfs/lsf/lsf/conf/lsf.conf
su - ldapadmin -s /bin/bash -c "bash -lc 'yes | bctrld restart sbd all'"
- 回退部署器(如需彻底摘除纳管):还原
stages/lsf_install.py、utils/config_validate.py、config/lsf_deploy.yaml(.example)(见backup/README.md),或把lsf.job_tmpdir置空 ——实现体在值为空时不探测、不追加,等效于不纳管。
回滚后验证:作业内 TMPDIR=[];--drift 仍 rc=0(配置项已置空)。
八、风险说明¶
| 风险 | 说明与缓解 |
|---|---|
| 重启 sbatchd 影响运行中作业 | 动手前 bjobs -u all 必须无 RUN(本次已确认);窗口选无作业时段 |
| 目录写满本地盘 | 作业结束 LSF 自动删除(实测);/local_scratch 为 50G 独立虚盘,不挤占系统盘 |
| 路径超 256 字符 | 取短路径 /local_scratch/users;配置校验强制绝对路径 |
| 与 Slurm 侧布局不一致 | 受 LSF 机制约束(无用户名占位符),已在本 SOP 明确;隔离靠 0700 |
--drift 漏检 |
已纳管进部署器阶段3-6(探测项 + 幂等追加),非手工改配置 |
附录 A:交付物清单¶
| 文件 | 说明 |
|---|---|
deploy/lsf/stages/lsf_install.py |
新增 conf_job_tmpdir / conf_set_tmpdir 探测项与幂等追加、生效提示 |
deploy/lsf/utils/config_validate.py |
白名单加 lsf.job_tmpdir;校验须为绝对路径 |
deploy/lsf/config/lsf_deploy.yaml(.example) |
新增 lsf.job_tmpdir: /local_scratch/users |
tmpdir_inject_20261008/SOP.md |
本文件 |
tmpdir_inject_20261008/backup/README.md |
备份台账 |
来源:
/home/rain/Documents/LSF/lsf_ins/tmpdir_inject_20261008/SOP.md| 最后更新:2026-10-08 03:48(由build/sync.py同步,请勿在站点侧修改)