我试图在一个大型计算机集群上运行一段代码,以便分析数据的不同部分。
我创建了两个循环,将作业分配给不同的节点和节点包含的cpu。
我编写的分析函数“chnJob()”,只需要获取一个索引,以了解需要分析的数据部分(在本例中是名为“chn”的shell变量)。
循环如下:

for NODE in $NODES; do # Loop through nodes
   for job_idx in {1..$PROCS_PER_NODE}; do # Loop through jobs per node (8 per node)
      echo "this is the channel $chn"
      ssh $NODE "matlab -nodisplay -nodesktop -nojvm -nosplash -r 'cd $WORK_DIR; chnJob($chn); quit'" &
      let chn++
      sleep 2
  done
done

即使我看到chn变量被适当地递增,传递给matlab函数的chn值始终是chn的最后一个值。
这可能是因为在每个节点上打开matlab需要花费大量时间,而bash在那时就完成了循环所以传递给每个matlab实例的值只是最后一个值。
有没有办法绕过这个问题调用函数时,我可以“烘焙”该变量的值吗?
还是问题完全不同?

最佳答案

Bash无法处理大括号范围表达式中的变量它们必须是文字:{1..10}由于现在的方式,每次迭代外部循环时都会精确地执行内部循环一次,而不是八次(或者无论PROCS_PER_NODE的值是什么)因此,chn从它的初始值变为它应该从NODES变为Original_chn时的正值。
改为使用C-styleNODES * PROCS_PER_NODE循环:

for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++))

您可以在for中同时增加job_idxchn(如果这不会导致一个问题):
for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++, chn++))

10-07 15:10