问题描述
我通常使用以下类似的方法来提交阵列作业,
#!/bin/bash
sbatch <<EOT
#!/bin/sh
#SBATCH --job-name=$1
#SBATCH --time=$2
#SBATCH --mem-per-cpu=$3
#SBATCH --array 0-$4
./myprogram.o ${SLURM_ARRAY_TASK_ID} <-- SLURM_ARRAY_TASK_ID not visible.. (A)
./script_that_runs_myprogram.sh <-- SLURM_ARRAY_TASK_ID visible inside script (B)
EOT
在情况(B)中,script_that_runs_myprogram.sh
可以看到定义任务ID的环境变量。在情况(A)中是否可以某种方式访问数组索引?似乎没有必要运行另一个脚本来运行该程序。手动定义SBATCH
参数的替代情况非常繁琐。
解决方法
$ {SLURM_ARRAY_TASK_ID}应该在选项A中可见。问题是,变量被bash评估得太早了。当您发送脚本时,Bash会解释该变量。那时,变量将仍然为空。尝试转义:
#!/bin/bash
sbatch <<EOT
#!/bin/sh
#SBATCH --job-name=$1
#SBATCH --time=$2
#SBATCH --mem-per-cpu=$3
#SBATCH --array 0-$4
./myprogram.o \${SLURM_ARRAY_TASK_ID}
EOT