2013-08-25 53 views
2

我试图在后台运行几台linux机器上的脚本。我的bash脚本是这样的:等待并行远程进程完成bash ssh

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个进程。

回答

2

随着GNU并行,你可以做到这一点,以每20台机器上运行40个作业:

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

的拆装硬盘会尽量做一个完整的安装;如果 失败,则进行个人安装;如果失败,最小 安装:

wget -O - pi.dk/3 | bash 

或:

curl pi.dk/3/ | bash 

手表简要介绍介绍视频: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

走过教程(男子parallel_tutorial)。你命令行 爱你。

0

在前台运行远程进程,并把ssh背景:

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

看起来非常有希望,但等待不起作用,所有进程一起启动。检查了我的输入,以确保它是正确的,但无法找到为什么这不起作用。 – Atlas

+0

确保远程命令不会重定向stdin。其中一个标准文件描述符必须保持连接到SSH连接,以便ssh将等待远程命令完成。 – Barmar

1

您应该使用是为了这个目的而设计的工具。我使用pssh(又名并行ssh),它工作得很好。

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

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个进程。

+0

也试过这种方法。脚本执行正常但没有任何反应。即不启动远程进程。 – Atlas

+0

你确定吗?尝试在脚本的末尾放置“wait”。 –

0

一个并行的SSH客户端(pdsh,cssh,pssh等)将会是一条路。