繁体   English   中英

并行运行 for 循环以在 posix 中运行 k6

[英]Run parallel for loop to run k6 in posix

我需要在posix shell(不是bash)中运行并行for循环。 但它目前没有在 docker 中执行,并且在将&添加到 for 循环时跳过了该语句。

详细参考问题: Shell 脚本未作为 bash 使用 Dockerfile 运行

参考问题的代码片段:

if [ -z "$GWC_PC_ID" ]
then
   ENV_NAME=$ENV_NAME RUN_OPTIONS=$SCENARIO_NAME-$ENV_NAME$OPTIONS_VARIANT k6 run $K6_RUN_OPTIONS ''$SCENARIO/index.js''
else
   for pcId in $(printf '%s' "$GWC_PC_ID" | tr , ' ');
   do
      ENV_NAME=$ENV_NAME RUN_OPTIONS=$SCENARIO_NAME-$ENV_NAME$OPTIONS_VARIANT GWC_PC_ID=$pcId k6 run $K6_RUN_OPTIONS ''$SCENARIO/index.js'' &
   done
fi

在这里,如果我给出空输入,它运行良好,但对于非空输入,它不会在 for 循环内执行语句。 请注意,如果我删除&然后它执行 for 循环内的语句,但我需要并行运行这些语句。

问题是因为它在执行分叉线程之前没有等待进程完成并退出。 为了等待分叉的线程,我需要一个进程 ID 数组。 由于不支持阵列,我在 docker 中安装了 bash。

为此,我修改了 Dockerfile 如下:

FROM grafana/k6:0.40.0
COPY ./src/lib /lib
COPY ./src/scenarios /scenarios
COPY ./src/k6-run-all.sh /k6-run-all.sh
WORKDIR /
ENTRYPOINT []
USER root
RUN apk add --no-cache bash
CMD ["bash", "-c", "./k6-run-all.sh"]

此外,我在脚本中添加了以下内容以等待进程完成:

if [ -z "$GWC_PC_ID" ]
then
   ENV_NAME=$ENV_NAME RUN_OPTIONS=$SCENARIO_NAME-$ENV_NAME$OPTIONS_VARIANT k6 run $K6_RUN_OPTIONS ''$SCENARIO/index.js''
else
   i=0
   for pcId in $(printf '%s' "$GWC_PC_ID" | tr , ' ');
   do
      ENV_NAME=$ENV_NAME RUN_OPTIONS=$SCENARIO_NAME-$ENV_NAME$OPTIONS_VARIANT GWC_PC_ID=$pcId k6 run $K6_RUN_OPTIONS ''$SCENARIO/index.js'' &
      pids[${i}]=$!
      ((i=i+1))
   done
fi

# wait for all pids
for pid in ${pids[*]}; do
    echo "Waiting for" $pid
    wait $pid
done

还将#!/bin/bash添加到此脚本文件的顶部。

暂无
暂无

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

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