等待PID端信号



我写了一个脚本以并行化matlab(我在MATLAB并行计算工具箱中遇到了一些麻烦)。这个想法是在所有可用的处理器上同时启动MATLAB。目前,该脚本启动MATLAB的次数要比机器上的处理器多。我想知道如何在代码中添加一些东西,以等待信号。该信号意味着"是的,继续前进"。

如何确定每个任务都在另一个核心上发送?

此外,我正在使用一台远程计算机,我希望能够在代码继续运行时关闭终端。因此,我使用拒绝,如何确定拒绝适用于上一行上启动的作业?

非常感谢

#! /bin/bash
#
# parmat.sh   File   Nb_iteration
#
np=$(nproc)
echo "nombre de processeurs disponibles : "$np
nbf=$(( $2 / $np))   #number of loops on all processors
rmd=$(expr $2 % $np) #remainder
# Loop
for var1 in $(seq 1 $nbf)
do
lp=$((var1 * $np - $np + 1))
le=$(($lp + $np - 1))
for var in $(seq $lp $le) 
do
  echo $var
  sed s/pl_id/$var/g <$1 >temp_$var.m
  /applications/matlab/r2013a/bin/matlab -nodesktop -r temp_$var &
  #rm temp_$var.m 
  disown
done
#write something for the loop to wait that all matlabs finished their run.
done
# Remainder
if [ "$rmd" -ne "0" ]
then
   lp=$(($nbf * $np + 1))
   le=$(($lp + $rmd - 1))
   for var in $(seq $lp $le) 
   do
      echo $var
      sed s/pl_id/$var/g <$1 >temp_$var.m
      /usr/local/MATLAB/R2011b/bin/matlab -nodesktop -r temp_$var &
      #rm temp_$var.m 
      disown
   done
 fi

您可以尝试在单独的背景子壳中执行每个MATLAB实例,然后在外循环底部调用wait

这是我想到的一个例子(i think )解决了这两个问题(即如何等待所有实例完成,以及如何在特定CPU上运行每个实例):

#!/bin/bash
numCpus=$(grep -c ^processor /proc/cpuinfo) # I don't have nproc on my system
for cpu in $(seq 0 $((numCpus-1))); do
  (
    sleepSecs=$(( RANDOM % 10 + 1 ))
    echo "Sleeping for $sleepSecs seconds on CPU $cpu..."
    taskset -c $cpu sleep $sleepSecs
    echo "Done sleeping on CPU $cpu."
  ) &
done
usleep 500 # This is just here to keep the output ordered correctly
echo "Waiting for subshells to finish..."
wait
echo "All subshells completed."

每个子壳以&后缀在背景中运行,并在1到10秒之间随机睡觉。在产卵子壳后,致电wait没有参数,导致父壳等待所有子壳完成。请注意,这是假设您在脚本之前没有在此之前产生任何其他子壳。如果有的话,您必须跟踪要等待的每个子壳的PID或工作编号,并将其作为参数传递给wait

在我的计算机上运行它,我得到了看起来像这样的东西:

Sleeping for 2 seconds on CPU 0...
Sleeping for 9 seconds on CPU 1...
Sleeping for 4 seconds on CPU 3...
Sleeping for 8 seconds on CPU 2...
Sleeping for 10 seconds on CPU 4...
Sleeping for 9 seconds on CPU 5...
Waiting for subshells to finish...
Done sleeping on CPU 0.
Done sleeping on CPU 3.
Done sleeping on CPU 2.
Done sleeping on CPU 5.
Done sleeping on CPU 1.
Done sleeping on CPU 4.
All subshells completed.

编辑:当然,如果您想视觉确认每个子壳在预期的CPU上运行,则应该让它执行sleep以外的其他事情,因为sleep(按设计)不做吃CPU周期,因此不会出现在CPU显示器上。您仍然可以通过打印每个产卵子壳的PID来确认,然后使用pstop验证其运行的CPU。这些命令默认情况下不会显示该信息,但是我敢肯定,有一些选项可以让它们显示。另外,请记住,尽管taskset让您设置一个过程'CPU亲和力,但不能保证内核会在该CPU上运行它,或者内核不会将其切换到另一个CPU。CPU亲和力更像是对要使用哪种CPU的内核的建议。

最新更新