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

How do I create a new directory for a Slurm job prior to setting the working directory?

我想为我 运行 的每个 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 选项必须在文件的顶部,并引用 documentation

before any executable commands

因此,在这种情况下,--chdir 不被接受是预期的行为。问题的基本原理是 Slurm 使用 #SBATCH 选项,特别是 --chdir 来设置作业开始的环境。该环境必须在作业开始之前决定,并且不能在之后由 Slurm 修改。

出于类似原因,#SBATCH 选项中未处理环境变量;它们只是被 Bash 忽略,因为它们在注释行中,并且 Slurm 不会自行扩展它们。

另请注意,--chdir 用于

Set the working directory of the batch script to directory before it is executed.

并且该目录必须存在。 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 行总是很有趣。它确保你的脚本 stops if any command in it fails.