我想为我运行的每个Slurm作业创建一个唯一的目录。但是,mkdir
似乎会中断SBATCH
命令。例如,当我尝试时:
#!/bin/bash
#SBATCH blah blah other Slurm commands
mkdir /path/to/my_dir_$SLURM_JOB_ID
#SBATCH --chdir=/path/to/my_dir_$SLURM_JOB_ID
touch test.txt
Slurm执行忠实地在/path/to/my_dir_$SLURM_JOB_ID
创建目录,但跳过--chdir
命令,从调用批处理的工作目录执行sbatch脚本。
有没有一种方法可以为作业的输出创建一个唯一的目录,并在单个sbatch脚本中设置工作目录?
首先,#SBATCH
选项必须位于文件的顶部,并引用文档
在任何可执行命令之前
因此,在这种情况下,不遵守--chdir
是意料之中的行为。问题的基本原理是,Slurm使用#SBATCH
选项,特别是--chdir
来设置作业启动的环境。该环境必须在作业开始前决定,之后Slurm不能修改。
出于类似的原因,#SBATCH
选项中不处理环境变量;它们只是被Bash忽略了,因为它们在评论行中,Slurm本身并没有努力扩展它们。
还要注意,--chdir
用于
在执行批处理脚本之前,将其工作目录设置为directory。
并且该目录必须存在。Slurm不会为你创建它。
您需要做的是在脚本中调用cd
命令。
#!/bin/bash
#SBATCH blah blah other Slurm commands
WORKDIR=/path/to/my_dir_$SLURM_JOB_ID
mkdir -p "$WORKDIR" && cd "$WORKDIR" || exit -1
touch test.txt
请注意exit -1
,这样,如果目录创建失败,您的作业将停止,而不是在提交目录中继续。
顺便说一句,在脚本中添加一行set -euo pipefail
总是很有趣的。如果脚本中的任何命令失败,它会确保脚本停止。