我有一个摘要脚本,可以通过不同的步骤将作业数组提交给Slurm:
#!/bin/bash
#SBATCH --ntasks 1
#SBATCH --nodes 1
#SBATCH --time 00-01:00:00
#SBATCH --array=0-15
dir="TEST_$SLURM_ARRAY_JOB_ID"
org=base-case
dst=$dir/case-$SLURM_ARRAY_TASK_ID
#step 0 -> I'd like that this step was executed only by one task!
srun mkdir $dir
#step 1
srun cp -r $org $dst
#step 2
srun python createParamsFile.py $dst $SLURM_ARRAY_TASK_ID
#step 3
srun python simulation.py $dst
我只想运行步骤0,因为其余任务将共享创建的目录。没什么大不了的,因为一旦创建目录,其余的尝试都会在创建目录时引发错误。但是,最好避免在日志中记录错误消息,并避免步骤中止。在这种情况下,请参见每个示例:
/usr/bin/mkdir: cannot create directory 'TEST_111224': File exists
srun: error: s02r3b83: task 0: Exited with exit code 1
srun: Terminating job step 111226.0
的确,如果我在没有srun的情况下执行mkdir命令,则步骤0不存在,并且不会突然终止。但是我仍然会收到错误消息。
使用-p
的mkdir
选项,以便mkdir
仅创建不存在的目录,并且日志中不会包含错误。
srun mkdir -p $dir
注意,在您的情况下,删除srun
不会更改任何内容,因为每个作业仅请求一个任务(--ntasks=1
)。该错误不是因为作业中的许多任务创建了相同的目录,而是因为阵列中的许多作业都创建了相同的目录。