如何在远程计算机上并行运行脚本?


16

我可以将SSH放入具有64个内核的远程计算机中。可以说我需要在这台机器上并行运行640个Shell脚本。我该怎么做呢?

我可以看到将640个脚本分成10个脚本的64个组。然后,我将如何并行运行这些组中的每个组,即在每个可用核心中的每个上一组。

将脚本的形式

    ./script_A &
    ./script_B &
    ./script_C &
    ...

哪里script_A对应第一组,script_B第二组等就足够了?

在一个内核上运行的一组内的脚本可以顺序运行,但是我希望这些组在所有内核上并行运行。


不能保证它们被内核平均分配。看看这个线程。stackoverflow.com/questions/13583146/...
瑞˚F里贝罗

Answers:


24

这看起来像gnu parallel的工作:

parallel bash -c ::: script_*

这样做的好处是您不必按核心对脚本进行分组,而是可以为您parallel完成此操作。

当然,如果您不想在脚本运行时暂挂SSH会话,则应使用nohupscreen


这是一个很好的答案,我接受它,因为在一般情况下,它会很好地工作。不幸的是,对于我个人而言,我没有远程计算机的管理员特权,因此无法安装parallel软件包。感谢`
汤姆(Tom)

10
您不必在全局范围内并行安装:您应该能够从自己的主目录运行副本。
dhag 2015年

bash -c可能是不需要的:parallel ::: ./script*。使用640脚本,它们可能非常相似(例如,仅一个参数不同)。为此,请考虑直接使用GNU Parallel设置这些参数并使用单个脚本。
Ole Tange

如何在远程计算机上并行安装gnu?
汤姆

@Tom使用远程计算机会改变什么?只需从gnu.org/software/parallel获得正确的软件包并安装。
德米特里·格里戈列耶夫

5

只要您不需要监视输出,并且只要脚本可以运行,就可以将ssh会话保持打开状态就可以了。如果这些都不是真的,我建议您使用screen多个标签。你可以做类似的事情

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

监视我不关心的输出-我不想让ssh会话保持打开状态。那使用nohup呢?如果会话结束,这可以防止脚本停止吗?我还将查看您的“屏幕建议”。谢谢!'
汤姆(Tom)

nohup可能会起作用,我只是更加熟悉,screen它具有许多功能,可能对您有用或无效。
大卫·金

2

要启动并管理大量脚本作业,您将需要某种管理软件来控制资源使用(CPU,内存,优先级),查看作业状态(等待,挂起,运行,完成)。

为此,构建了Grid Engine,例如,Sun Grid Engine(http://wiki.gridengine.info/wiki/index.php/Main_Page)或Open Grid Scheduler(http://gridscheduler.sourceforge.net/)。在开始之前,您确实需要管理员为您安装适当的软件。管理员可能很乐意这样做,而不是看到计算机上正在运行数百个进程,并且无法对其进行控制。

通常,管理员定义一台计算机可以划分为多少个插槽,然后将作业提交到队列中并指定该作业要消耗多少个插槽,Grid Engine将监视整个系统的使用情况,并根据管理员定义的排队策略。例如,最多可以同时运行x个作业,等等。其余的作业将处于等待状态的队列中,并在较早的作业完成后释放。



0

我已经做过很多次,通常只是滚动自己的脚本来完成作业控制。通常,如果您具有要在文件中运行的所有脚本的名称,则解决方案如下所示:

#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
  NUM=$((NUM+1))
  ssh remote.host.ip "${script}" > ${script}.log 2>&1 &
  if [ $NUM -ge $MAX_PROCS ];then
    echo "Waiting for $NUM processes to finish."
    wait
    NUM=0
  fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit

这是蛮力的,但有效。另外,您不需要在系统中添加任何其他软件,例如parallel。

一个大问题是,wait命令将等待最慢的脚本完成,这会浪费时间。我创建了脚本来解决这种情况,但是您可以想象它们会变得更加复杂。如果所有脚本的运行时间大致相同,则效果很好。

另一个问题是您可能必须调整MAX_PROCS才能确定最佳性能。

当然,ssh连接的数量可能会变得笨拙。在这种情况下,只需将此脚本移至远程主机,然后更改“ ssh ...”行即可直接运行脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.