在设置工作目录之前,如何为Slurm作业创建新目录



我想为我运行的每个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总是很有趣的。如果脚本中的任何命令失败,它会确保脚本停止。

最新更新