我试图在一个大型计算机集群上运行一段代码,以便分析数据的不同部分。
我创建了两个循环,将作业分配给不同的节点和节点包含的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_idx
和chn
(如果这不会导致一个问题):for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++, chn++))