gpt4 book ai didi

bash - 在bash脚本中并行下载文件

转载 作者:行者123 更新时间:2023-11-29 09:27:13 26 4
gpt4 key购买 nike

我正在使用以下逻辑一次从数组中下载 3 个文件,一旦所有 3 个文件完成,将只提取接下来的 3 个文件。

parallel=3
downLoad() {
while (( "$#" )); do
for (( i=0; i<$parallel; i++ )); do
echo "downloading ${1}..."
curl -s -o ${filename}.tar.gz <download_URL> &
shift
done
wait
echo "#################################"
done
}

downLoad ${layers[@]}

但我的期望是“在任何时间点应该运行 3 个下载”- 我的意思是假设我们将 3 个文件下载发送到后台,并且 3 个文件下载中的一个很快就完成了,因为大小非常小,我想要另一个应发送队列中的文件以供下载。

完整脚本:

#!/bin/bash

set -eu

reg="registry.hub.docker.com"
repo="hjd48"
image="redhat"
name="${repo}/${image}"
tag="latest"
parallel=3

# Get auth token
token=$( curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${name}:pull" | jq -r .token )

# Get layers
resp=$(curl -s -H "Authorization: Bearer $token" "https://${reg}/v2/${name}/manifests/${tag}" | jq -r .fsLayers[].blobSum )
layers=( $( echo $resp | tr ' ' '\n' | sort -u ) )

prun() {
PIDS=()
while (( "$#" )); do
if ( kill -0 ${PIDS[@]} 2>/dev/null ; [[ $(( ${#PIDS[@]} - $? )) -lt $parallel ]])
then
echo "Download: ${1}.tar.gz"
curl -s -o $1.tar.gz -L -H "Authorization: Bearer $token" "https://${reg}/v2/${name}/blobs/${1}" &
PIDS+=($!)
shift
fi
done
wait
}

prun ${layers[@]}

最佳答案

如果你不介意使用 xargs 那么你可以:

xargs -I xxx -P 3 sleep xxx < sleep

sleep 是:

1
2
3
4
5
6
7
8
9

如果您观看背景:

watch -n 1 -exec ps  --forest -g -p your-Bash-pid

(sleep 可能是您的链接数组)然后您会看到 3 作业并行运行,当这三个中的一个完成时,将添加下一个作业.事实上总是 3 作业一直运行到数组末尾。

watch(1) 的示例输出:

12260 pts/3    S+     0:00  \_ xargs -I xxx -P 3 sleep xxx
12263 pts/3 S+ 0:00 \_ sleep 1
12265 pts/3 S+ 0:00 \_ sleep 2
12267 pts/3 S+ 0:00 \_ sleep 3

xargs3 作业开始,当其中一个作业完成时,它将添加下一个结果:

12260 pts/3    S+     0:00  \_ xargs -I xxx -P 3 sleep xxx
12265 pts/3 S+ 0:00 \_ sleep 2
12267 pts/3 S+ 0:00 \_ sleep 3
12269 pts/3 S+ 0:00 \_ sleep 4 # this one was added

关于bash - 在bash脚本中并行下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49296214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com