如何获取SLURM中当前作业按任务分配的节点列表
解决Slurm生成按任务重复的节点列表问题
要生成每个任务对应一行节点名的纯文本列表,可以通过以下两种方法实现:
方法一:利用Slurm环境变量循环生成
Slurm提供了SLURM_JOB_NODELIST(节点列表)和SLURM_TASKS_PER_NODE(每个节点分配的任务数)两个环境变量,结合bash循环即可生成所需列表:
# 获取节点数组和每个节点的任务数数组 nodes=($(scontrol show hostnames $SLURM_JOB_NODELIST)) tasks_per_node=(${SLURM_TASKS_PER_NODE//,/ }) # 循环输出每个节点对应次数 for i in "${!nodes[@]}"; do node=${nodes[$i]} # 处理形如"3(x1)"的任务数格式,提取纯数字 count=${tasks_per_node[$i]//(x*)} for ((j=0; j<count; j++)); do echo "$node" done done
方法二:用srun直接生成
srun会为每个任务执行指定命令,因此只需调用hostname即可让每个任务输出自身所在节点,直接得到目标列表:
srun --ntasks $SLURM_NTASKS hostname
如果需要将结果保存到文件,可直接重定向输出:
srun --ntasks $SLURM_NTASKS hostname > node_list.txt
以上两种方法均会根据Slurm分配的任务数,重复输出对应节点名,完全匹配你需要的格式(比如node1重复3次、node2重复1次)。
内容的提问来源于stack exchange,提问作者Luis M Rodriguez-R
相关产品推荐
相关产品推荐

