You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将集群作业结果保存至job.sh所在目录?

解决方案:自动让作业结果保存到脚本所在目录

你完全可以通过bash脚本的路径处理逻辑实现这个需求,不用手动修改每个job.sh的-wd路径。这里有两种可靠的方案,推荐第一种更灵活的方式:

方法1:脚本运行时自动切换到自身目录(推荐)

不用依赖#$ -wd参数,而是在脚本启动时自动切换到它所在的目录。这样不管你从哪个目录执行qsub job.sh,作业都会在脚本目录下生成结果,完美匹配你的需求。

修改后的job.sh模板如下:

#!/bin/bash -l
#$ -S /bin/bash
#$ -l h_rt=00:30:0
#$ -l mem=2G
#$ -l tmpfs=15G
#$ -N md_0_1
#$ -pe mpi 4

# 获取脚本所在的绝对目录(解决相对路径提交的问题)
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
# 切换到该目录,如果切换失败直接退出作业,避免后续命令出错
cd "$SCRIPT_DIR" || { echo "Failed to enter script directory: $SCRIPT_DIR" >&2; exit 1; }

module unload compilers mpi
module load compilers/intel/2015/update2
module load mpi/intel/2015/update3/intel
module load gromacs/5.1.1/intel-2015-update2
gmx mdrun -deffnm md_0_1

原理说明

  • readlink -f "$0":获取脚本的绝对路径,就算你用相对路径提交脚本,也能准确找到它的实际位置
  • dirname ...:从绝对路径中提取出目录部分
  • cd "$SCRIPT_DIR" || exit 1:确保目录切换成功,避免后续命令在错误的路径下执行导致结果保存位置错误

方法2:批量自动更新#$ -wd参数(适用于必须指定-wd的场景)

如果你一定要通过#$ -wd来设置工作目录,可以写一个批量处理脚本,一次性更新所有job.sh的路径:

#!/bin/bash
# 批量更新所有job.sh的-wd路径为自身所在目录
find /path/to/all/job/scripts -name "job.sh" | while read -r script; do
    # 获取当前脚本的绝对目录
    script_dir=$(dirname "$(readlink -f "$script")")
    # 替换原来的-wd行(匹配以#$ -wd开头的行)
    sed -i "s|^#\$ -wd .*|#\$ -wd $script_dir|" "$script"
done

运行这个脚本后,所有job.sh的#$ -wd都会自动指向自己的所在目录,之后你就可以正常用qsub提交了。

注意事项

  • 记得把/path/to/all/job/scripts替换成你存放所有job.sh的根路径
  • 如果你的job.sh中-wd行的格式比较特殊(比如带注释或多余空格),可能需要微调sed的匹配规则

对比下来,方法1更灵活——不管以后你把脚本移动到哪个目录,都不用做任何修改,脚本会自动适配所在路径。

内容的提问来源于stack exchange,提问作者lanselibai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:35:17