访问阵列作业的任务ID

问题描述

我通常使用以下类似的方法来提交阵列作业,

#!/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