[英]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.