2

我正在尝试在后台的几台 linux 机器上运行脚本。我的 bash 脚本如下所示:

for i in {1..1000}; do  
  for j in {1..20}; do      
    ssh -n -f remotehost$j "sh -c 'cd /blah/; nohup ./script.sh $i > /dev/null 2>&1 &'"
    NPROC=$(($NPROC+1))
    if [ "$NPROC" -ge 40 ]; then
        echo "Waiting for work to finish"
        wait
        NPROC=0
    fi        
  done    
done

这是我尝试限制服务器上的负载,并且在任何给定时间只有 40 个进程在 20 个主机上运行。这不起作用,所有进程同时启动。您能否指导我如何等待远程后台进程完成或防止超过 n 个进程在给定的远程主机上启动。

4

6 回答 6

2

使用 GNU Parallel,您可以在 20 台机器上运行 40 个作业:

parallel -j20 seq 1000 \| parallel -j40 -I I ssh server{} \''"cd /blah/; ./script.sh I"'\' ::: {1..20}

10 秒安装将尝试完全安装;如果失败,个人安装;如果失败,最小安装:

wget -O - pi.dk/3 | bash

或者:

curl pi.dk/3/ | bash

观看介绍视频以进行快速介绍: https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

浏览本教程(man parallel_tutorial)。你爱你的命令行。

于 2013-08-29T16:36:58.953 回答
1

您应该使用专门为此目的设计的工具。我使用pssh(又名并行 ssh),效果很好。

此外,它在常见的 Linux 存储库中广泛可用,例如在 Ubuntu 中,您可以使用sudo apt-get install pssh.

于 2013-08-25T18:40:02.277 回答
1

也可以查看 GNU Parallel:http ://www.gnu.org/software/parallel/ 。

于 2013-08-25T19:23:00.467 回答
0

在前台运行远程进程,并ssh在后台运行:

ssh -n -f remotehost$j "sh -c 'cd /blah/; ./script.sh $i > /dev/null 2>&1 '" &
于 2013-08-25T18:26:42.810 回答
0

您可以使用xargs来限制进程数:

maxPerServer=2
for j in {1..20}; do
    echo -n {1..1000} | xargs -P "$maxPerServer" -d ' ' ssh -n -f remotehost$j "sh -c 'cd /blah/; ./script.sh {} > /dev/null 2>&1 '" &
done

此代码将在每台服务器上运行最多 2 个进程。

于 2013-08-25T18:40:48.640 回答
0

并行 SSH 客户端(pdsh、cssh、pssh 等)将是可行的方法。

于 2013-10-11T21:39:49.423 回答