如何在 scp 文件时并行化 for 循环?

如何在 scp 文件时并行化 for 循环?

我正在运行下面的 shell 脚本,将machineA文件machineB和复制machineC到 中machineA。如果文件不在 中machineB,那么它应该在 中machineC

下面的 shell 脚本将把文件复制到TEST1目录TEST2machineA

#!/bin/bash
set -e

readonly TEST1=/data01/test1
readonly TEST2=/data02/test2
readonly SERVER_LOCATION=(machineB machineC)
readonly FILE_LOCATION=/data/snapshot

dir1=$(ssh -o "StrictHostKeyChecking no" david@${SERVER_LOCATION[0]} ls -dt1 "$FILE_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${SERVER_LOCATION[1]} ls -dt1 "$FILE_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

echo $dir1
echo $dir2

if [ "$dir1" = "$dir2" ]
then
    rm -rf $TEST1/*
    rm -rf $TEST2/*
    for el in $test1_partition
    do
        scp david@${SERVER_LOCATION[0]}:$dir1/pp_monthly_9800_"$el"_200003_5.data $TEST1/. || scp david@${SERVER_LOCATION[1]}:$dir2/pp_monthly_9800_"$el"_200003_5.data $TEST1/.
    done
    for sl in $test2_partition
    do    
        scp david@${SERVER_LOCATION[0]}:$dir1/pp_monthly_9800_"$sl"_200003_5.data $TEST2/. || scp david@${SERVER_LOCATION[1]}:$dir2/pp_monthly_9800_"$sl"_200003_5.data $TEST2/.
    done
fi

https://unix.stackexchange.com/questions/53390/is-there-a-way-to-run-process-parallelly-in-the-loop-of-a-bash-script

当前,它首先从目录复制文件machineB并将其复制machineCmachineA TEST1目录中,然后,只有完成之后,它才会从目录复制文件并将其复制machineBmachineC目录中。有什么方法可以同时在目录和目录中machineA TEST2传输文件吗?TEST1TEST2

我正在运行 Ubuntu 12.04

答案1

代替

done

done &

这将在后台启动两个 for 循环。

并使用以下命令完成脚本:

wait

这将等待两个 for 循环完成。

答案2

尝试这样的事情。

PROCESSES=4  # Number of threads you want
for item in ${LIST}; do
    ACTION ${item} &
    while (( $(jobs |wc -l) >= (( ${PROCESSES} + 1 )) )); do
        sleep 0.1
    done
done
wait

这将处理 LIST 中的项目,并在后台针对项目执行 ACTION。

然后,它会检查有多少作业仍在运行,并等到线程不再阻塞后再继续。

相关内容