如何将集群作业结果保存至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
相关产品推荐
相关产品推荐

