Bash 在设置工作目录之前,如何为Slurm作业创建新目录?
我想为我运行的每个Slurm作业创建一个唯一的目录。但是,Bash 在设置工作目录之前,如何为Slurm作业创建新目录?,bash,slurm,working-directory,sbatch,Bash,Slurm,Working Directory,Sbatch,我想为我运行的每个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\u$Slurm_JOB\u I
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\u$Slurm_JOB\u 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
请注意退出-1
,这样,如果目录创建失败,您的作业将停止,而不是在提交目录中继续
作为旁注,在脚本中添加
set-euo pipefail
行总是很有趣的。它确保您的脚本调用cd
在回顾时显得如此明显。谢谢对于我的代码,pipefail
也是一个完美的补充,因为在分叉代码中获得适当的kill并不总是干净的。我希望我能再次投你赞成票。