在 bash 中调试多处理

问题描述 投票:0回答:1

我正在尝试在 bash(在 CentOs 上)中通过多个进程运行一个函数。 该函数对curl进行不同的过滤:

STEP=50
    function filtering() {
        local i="$1"
        curl -s -g -X GET 'https://url.com?filter='$i'_filter'
    }

    for (( i=0; i<=TOTAL; i+=STEP )); do
        filtering "$i" 
    done
    wait

按原样运行即可工作。然而,当我在 10 个进程中运行该函数时,它的行为很奇怪,每次都会带来不同的结果,而且大多不可靠(根据生成的数字与上面的串行过滤相比)。我的代码是:

PARALLEL_PROCESSES=10
ACTIVE_PROCESSES=0
    for (( i=0; i<=TOTAL; i+=STEP )); do
        filtering "$i" > /dev/null 2>&1 &
        (( ACTIVE_PROCESSES++ ))
        if (( ACTIVE_PROCESSES >= PARALLEL_PROCESSES )); then
            wait -n 2> /dev/null
            (( ACTIVE_PROCESSES-- )) 
        fi
    done
    wait 

当我检查所有打印的过滤器时,一切看起来都很好。我认为

curl
没有得到正确的结果。
GNU parallel
也没有完成我的任务。我认为调试自己的并行化会更容易。

我非常感谢有关如何调试内部发生/错误的实用建议,以及实现我的目标的任何替代建议。

linux bash shell scripting
1个回答
0
投票

为了调试,请尝试将外部调用替换为您控制的内容。
我不知道

unreliable
结果是什么,你能用

重现它们吗
#!/bin/bash
STEP=50
TOTAL=2000
filtering() {
  local j="$1"
  sleeptime="0.$((RANDOM%10))"
  sleep $sleeptime
  printf "Filter %s\n" $j #l -s -g -X GET 'https://url.com?filter='$i'_filter'
}

PARALLEL_PROCESSES=30
ACTIVE_PROCESSES=0
for (( i=0; i<=TOTAL; i+=STEP )); do
  filtering "$i" & # > /dev/null 2>&1 &
  (( ACTIVE_PROCESSES++ ))
  if (( ACTIVE_PROCESSES >= PARALLEL_PROCESSES )); then
    wait -n 2> /dev/null
    (( ACTIVE_PROCESSES-- ))
  fi
done

当它重现您的问题时,您可以将脚本更改为最小的复杂性。将步骤更改为 1,将 TOTAL 更改为 10 可能会有所帮助。
您可能会注意到,非并行和并行方法中的步骤数不同(TOTAL % STEP 与 ACTIVE_PROCESSES)以及并行情况输出中的“随机”顺序。

当它没有重现您的问题时,则表示

curl
(或远程站点)出现了问题。在
curl -v
旁边,您可能会尝试在没有 get 或其他网站的情况下更改某些内容。
当站点(或您的防火墙或网络)有许多并行请求时,您会发现该站点(或您的防火墙或网络)显示出问题。

© www.soinside.com 2019 - 2024. All rights reserved.