【问题标题】:Wait inside loop bash在循环bash中等待
【发布时间】:2015-07-03 10:34:35
【问题描述】:

我创建了一个循环来读取.txt 并使用每一行作为输入执行另一个shell。

问题:我需要循环并行执行 txt 中的前两行,等待它们完成,然后并行执行接下来的两行。

尝试解决方案:我想添加一个等待命令,只是不确定如何构造,所以它每两行等待一次,而不是循环的每一次流失。

我当前的循环:

cat input.txt | while read line; do
export step=${line//\"/}
export step=ExecuteModel_${step//,/_}
export pov=$line
$owsdirectory"/hpm_ws_client.sh" processCalcScriptOptions "$appName" "$pov" "$layers" "$stages" "" "$stages" "$stages" FALSE > "$appLogFolder""/"$step"_ProcessID.log"

/app/dev2/batch/hpcm/shellexe/rate_tool2/model_automation/check_process_status.sh "$appLogFolder" "$step" > "$appLogFolder""/""$step""_Monitor.log"

输入文本:

SEQ010,FY15
SEQ010,FY16
SEQ020,FY15
SEQ020,FY16
SEQ030,FY15
SEQ030,FY16
SEQ030,FY15
SEQ030,FY16
SEQ040,FY15
SEQ040,FY16
SEQ050,FY15
SEQ050,FY16

【问题讨论】:

    标签: linux bash for-loop while-loop wait


    【解决方案1】:

    通常您会使用 semxargsparallel 来并行化循环,但所有这些工具通过始终并行运行 2(或 N)个作业并将新作业作为旧作业启动来优化吞吐量完成。

    要改为运行成对作业并等待两者都完成后再考虑开始更多,您可以在后台运行它们并在每 N 次迭代中保持一个计数器 wait

    printf "%s\n" {1..10} | while IFS= read -r line
        do
           echo "Starting command"
           sleep 2 &
    
           if (( ++i % 2 == 0 ))
           then
             echo "Waiting..."
             wait
           fi
        done
    

    输出:

    Starting command
    Starting command
    Waiting...
    Starting command
    Starting command
    Waiting...
    

    【讨论】:

    • @KarolyHorvath 你是什么意思?
    • 鉴于请求 wait 在这里完全正确,而 sleep 不正确。
    • 这里唯一需要注意的是,这将导致无法(除非有我不知道的技巧)获得等待命令的退出状态。
    • @PrestonAlexander 在我的示例中,sleep 2 是为了说明而在后台运行的命令。您应该在后台使用& 运行您自己的命令,并且不要在任何地方使用sleep 2
    • 如果hpm_ws_client.sh 刚刚开始某事并在check_process_status.sh 等待它时立即返回,听起来你只想后台check_process_status.sh
    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 2016-04-20
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多