【问题标题】:Wait for parallel remote process to finish bash ssh等待并行远程进程完成 bash ssh
【发布时间】:2013-08-25 18:23:05
【问题描述】:

我试图在后台在多台 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 个进程。

【问题讨论】:

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


    【解决方案1】:

    使用 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)。你命令行 爱你。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        也检查 GNU Parallel:http://www.gnu.org/software/parallel/

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 看起来很有希望,但 wait 对此不起作用,所有进程一起启动。检查了我的输入以确保它是正确的,但无法找出为什么这不起作用。
          • 确保远程命令不会重定向标准输入。标准文件描述符之一必须与 SSH 连接保持连接,以便 ssh 等待远程命令完成。
          【解决方案5】:

          可以使用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 个进程。

          【讨论】:

          • 也试过这种方法。脚本执行良好,但没有任何反应。即没有启动远程进程。
          • 你确定吗?尝试将wait 放在脚本末尾。
          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-10
            • 1970-01-01
            • 2016-09-08
            • 2010-11-06
            相关资源
            最近更新 更多