我想用不同的参数运行一个文件两次,每个任务在一个节点上,例如节点1上的任务1和节点2上的任务2,用我的代码仅执行第一个任务。我不知道这是什么问题,这是我的新手,这是我的代码:
#!/bin/bash
node_names=(compute-0-4 compute-0-6)
parameter=(parte__00 parte__01)
#SBATCH -N 2
#SBATCH -n 2
#SBATCH -c 1
srun -n1 -N1 -w $node_names[0] file.sh $parameter[0] &
srun -n1 -N1 -w $node_names[1] file.sh $parameter[1] &
wait
当我运行代码时,只有最后一个作业排队,如果执行scontrol show作业,我会得到这个
这只是第二个作业排队,第一个作业没有排队
答案 0 :(得分:0)
现有脚本的问题在于,您需要使用弯曲的方括号来引用bash中的数组项。如果您有$node_names[0]
,则需要${node_names[0]}
。
也就是说...第二个数组中的参数是否直接映射到第一个数组中的节点?如果是这种情况,那么类似的方法可能对您更好:
#!/bin/bash
node_names=(compute-0-3 compute-0-4)
parameter=(parte__00 parte__01)
for i in "${!node_names[@]}"; do
srun -n1 -N1 -w "${node_names[$i]}" file.sh "${parameter[$i]}" &
done
wait
这将在$i
中为每个索引设置$node_names
的情况下运行循环。对于每次迭代,脚本都会以srun
为背景。您可以通过修改阵列来扩展群集。
答案 1 :(得分:0)
#SBATCH
行必须在任何非注释行之前。试试这样的东西:
#!/bin/bash
#SBATCH -N 2
#SBATCH -n 2
#SBATCH -c 1
node_names=(compute-0-4 compute-0-6)
parameter=(parte__00 parte__01)
srun -n1 -N1 -w $node_names[0] file.sh $parameter[0] &
srun -n1 -N1 -w $node_names[1] file.sh $parameter[1] &
wait
此外,如果您的应用程序是完全独立的,那么您仅可以提交2个作业,而不是尝试仅在1个作业中运行所有作业。