等待并行远程进程完成bash ssh

时间:2013-08-25 18:23:05

标签: linux bash ssh parallel-processing background-process

我正在尝试在后台运行几台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个进程。

6 个答案:

答案 0 :(得分: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)。你命令行 爱你吧。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

结帐GNU Parallel:http://www.gnu.org/software/parallel/

答案 3 :(得分:0)

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

ssh -n -f remotehost$j "sh -c 'cd /blah/; ./script.sh $i > /dev/null 2>&1 '" &

答案 4 :(得分: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个进程。

答案 5 :(得分:0)

并行SSH客户端(pdsh,cssh,pssh等)将是最佳选择。