我正在尝试在后台运行几台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个进程。
答案 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等)将是最佳选择。