如何在设置工作目录之前为 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.
我想为我 运行 的每个 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.