繁体   English   中英

您可以在单个 bash 脚本中同时运行相同的循环 3 次吗?

[英]Can you run the same loop simultaneously 3 times in a single bash script?

如果你能指出我正确的方向,我相信我最终能弄清楚。

我有一个从 i=1 到 i=75 的循环。 但我最多可以同时运行 3 次,所以我只能在 3 个单独的终端中运行它,如 i=1 到 i=25、i=26 到 i=50、i=51 到 i= 75.

理想情况下,我希望它在同一个脚本中运行,并且对于循环的所有 3 个实例同时运行,并从 i=1 开始并在 i=75 结束,但是没有重叠 i 已经完成或正在由不同的实例完成循环。

示例处理:

  • Loop1 开始 i=1
  • Loop2 跳过 i=1,Loop2 开始 i=2
  • Loop3 跳过 i=1,2,Loop3 开始 i=3
  • Loop2 完成 i=2,Loop2 跳过 i=3,Loop2 开始 i=4
  • Loop3 完成 i=3,Loop3 跳过 i=4,Loop3 开始 i=5
  • Loop1 完成 i=1,Loop1 跳过 i=2,3,4,5 Loop1 开始 i=6
  • Loop1 完成 i=6,Loop1 开始 i=7
  • Loop3 完成 i=5,Loop3 跳过 i=7,Loop3 开始 i=8

循环的结构基本上是这样的

u=0
while [ $u -lt 1000 ]
do
    ((u++))
    i=$1
    while [ $i -le $2 ]
    do
        curl #(that sends begining command $i)
        sleep 60
        variable1=$(curl $i) #command that outputs a number which can change every 60 seconds
        variable2=$(curl $i) #command that outputs a number which is static
        counter=0 
        until [ variable1 -ne $variable2 ]
        do
            ((counter++))
            echo waiting 60 seconds 
            echo times waited: $counter
            sleep 60
            variable1=$(curl $i) #command that outputs a number which can change every 60 seconds
            variable2=$(curl $i) #command that outputs a number which is static
        curl #(that sends ending command $i)
        ((i++))
        done
done

我提供了一种简单的方法来完成此操作,并让您根据需要对其进行自定义:

#!/bin/bash

function myLoopFunction {
  param1 = $1
  param2 = $2

  # Some code...
}

myLoopFunction value1a value2a & # Run 1
myLoopFunction value1b value2b & # Run 2
myLoopFunction value1c value2c & # Run 3

wait # Wait for termination...

N=3
for (( i = 0; i < N; i++ ))
do ( 
    switch $i in
       0) setup_loop_0 ;;
       1) setup_loop_1 ;;
       2) setup_loop_2 ;;
    esac

    echo any commands
    sleep 2
    echo finish
)& done
wait

笔记:

  • N=3定义了并行执行的次数。
  • for (( i = 0; i < N; i++ )); do... done for (( i = 0; i < N; i++ )); do... done循环
  • 您可以编写(( i = 1; i <= N; i++ ))而不是(( i = 0; i < N; i++ ))来获取变量i的值 1..3 而不是 0..2。
  • (... )声明一个子外壳。
  • 后面的& )在后台启动子 shell
  • wait一直等到所有子 shell 都终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM