【问题标题】:linux batch jobs in parallellinux批处理作业并行
【发布时间】:2012-11-12 05:46:26
【问题描述】:

我有七个特定软件的许可证。因此,我想同时开始 7 个工作。我可以使用'&'来做到这一点。现在,“等待”命令等到所有这 7 个进程结束以生成下一个 7 个进程。现在,我想编写 shell 脚本,在我开始前 7 个进程之后,当一个工作完成时我想开始另一个。这是因为这 7 项工作中的一些可能需要很长时间,而另一些则很快就会完成。我不想浪费时间等待他们全部完成。有没有办法在linux中做到这一点?你能帮帮我吗?

谢谢。

【问题讨论】:

    标签: linux parallel-processing background-process batch-processing


    【解决方案1】:

    编写两个脚本。一个在每次完成时重新启动作业,另一个在第一个脚本启动 7 次。

    喜欢:

    script1:
    
    ./script2 job1
    ...
    ./script2 job7
    

    script2:
    
    while(...)
      ./jobX
    

    【讨论】:

      【解决方案2】:

      您可以检查当前正在运行的数量,如果少于 7 个则开始更多:

      while true; do
          if [ "`ps ax -o comm | grep process-name | wc -l`" -lt 7 ]; then
              process-name &
          fi
          sleep 1
      done
      

      【讨论】:

      • ps auxw | grep process-name | wc -l 将在此处启动 7 个进程时显示 8
      • 谢谢。我没有使用 ps auxw 而是一个监控当前正在使用的许可证数量的命令(与用户 ID 无关,因为它们是共享网络许可证)。我喜欢使用“if”来检查它并睡几秒钟的想法。这有帮助。非常感谢。
      【解决方案3】:

      GNU parallel 是要走的路。它设计用于启动同一命令的多个实例,每个实例具有从stdin 或外部文件检索到的不同参数。

      假设您的许可脚本名为myScript,每个实例具有相同的选项--arg1 --arg2,并为每个生成的实例采用可变参数--argVariable,这些参数存储在文件myParameters 中:

      cat myParameters | parallel -halt 1 --jobs 7 ./myScript --arg1 --argVariable {} --arg2
      

      解释:

      • -halt 1 告诉 parallel 停止所有作业,如果一个失败了
      • --jobs 7 将启动 7 个 myScript 实例

      在基于 debian 的 linux 系统上,您可以使用以下命令安装 parallel

      sudo apt-get install parallel
      

      作为奖励,如果您的许可证允许,您甚至可以告诉 parallel 在多台计算机中启动这 7 个实例。

      【讨论】:

        【解决方案4】:

        我使用 找到了一个相当不错的解决方案,它是标准发行版的一部分。见here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-28
          • 2013-10-21
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          • 2014-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多