Slurm:如何获取已完成作业的stdout/stderr文件路径
获取Slurm已完成作业的stdout/stderr路径方法
以下是几种无需修改slurm.conf的可行方案:
结合
sacct的WorkDir字段推断路径
虽然sacct不直接输出stdout/stderr路径,但它可以返回作业提交时的工作目录(WorkDir字段)。如果提交脚本里--output/--error使用的是相对路径(比如--output=slurm-%j.out),可以通过以下步骤拼接完整路径:- 执行
sacct -j $JobId --format=WorkDir --noheader | xargs获取作业的工作目录 - 结合脚本中定义的输出文件名(若能找到提交脚本),或利用Slurm占位符规则(如
%j对应JobId)拼接完整路径。示例命令:WORKDIR=$(sacct -j $JobId --format=WorkDir --noheader | xargs) # 假设脚本中用的是--output=slurm-%j.out STDOUT_PATH="$WORKDIR/slurm-$JobId.out"
- 执行
查看Slurm作业Spool目录的残留元数据
部分集群会在Slurm的spool目录中保留已完成作业的元数据文件,普通用户通常有权限访问自己作业的相关文件。常见的spool路径如/var/spool/slurm/ctld或/var/spool/slurm/d,可尝试查找以目标JobId命名的文件,其中包含完整的stdout/stderr路径。示例命令:# 替换为集群实际的spool路径 grep -r "StdOut" /var/spool/slurm/ctld/*$JobId*请求集群管理员查询Slurm数据库
如果集群配置了Slurm数据库(如MySQL/PostgreSQL),数据库的job表中会存储stdout_path和stderr_path字段。普通用户一般无直接查询权限,可联系管理员协助提取这些信息。后续作业的预防方案:主动记录提交信息
对于之后提交的作业,可以在提交时自动记录JobId和对应的输出路径到本地日志,避免后续找不到路径。示例脚本片段:JOB_ID=$(sbatch $submission_file | awk '{print $4}') # 从提交脚本中提取--output和--error参数 STDOUT_PATTERN=$(grep -oP '#SBATCH --output=\K.*' $submission_file) STDERR_PATTERN=$(grep -oP '#SBATCH --error=\K.*' $submission_file) # 替换占位符为实际JobId STDOUT_PATH=${STDOUT_PATTERN//%j/$JOB_ID} STDERR_PATH=${STDERR_PATTERN//%j/$JOB_ID} # 追加到本地日志文件 echo "$(date) | Job $JOB_ID | STDOUT: $STDOUT_PATH | STDERR: $STDERR_PATH" >> ~/slurm_job_records.log
内容的提问来源于stack exchange,提问作者baptiste colle
相关产品推荐
相关产品推荐

