等待pid结束信号

时间:2014-03-07 17:02:01

标签: bash matlab parallel-processing pid

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

如何确保每个任务都在不同的核心上发送?

此外,我正在远程计算机上工作,我希望能够在代码保持运行时关闭我的终端。所以我使用disown,如何确保disown适用于上一行启动的作业?

非常感谢

#! /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

1 个答案:

答案 0 :(得分:1)

您可以尝试在单独的后台子shell中执行每个matlab实例,然后只在外部循环的底部调用wait

这是我提出的一个例子(我认为)解决了两个问题(即,如何等待所有实例完成,以及如何在特定CPU上运行每个实例): / p>

#!/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."

每个子shell都在后台运行&后缀,并在1到10秒之间随机休眠。产生子shell后,调用wait没有参数会导致父shell等待所有子shell完成。请注意,这假设您尚未在脚本中的此点之前生成任何其他子shell。如果有,则必须跟踪要等待的每个子shell的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上运行每个子shell的可视化确认,那么您应该让它执行sleep之外的其他操作,因为{{1} (按设计)不占用CPU周期,因此不会显示在CPU监视器上。您仍然可以通过打印出每个生成的子shell的PID来确认,然后使用sleepps验证它们正在运行的CPU。默认情况下,这些命令不显示该信息,但我确信有一些选项可以让它们显示它。另外,请记住,尽管top允许您设置进程的CPU亲和性,但无法保证内核将在该CPU上运行它,或者内核不会将其切换到另一个CPU。 CPU亲和性更像是内核关于使用哪个CPU的建议。