web-dev-qa-db-ja.com

ファイルをscpしながらforループを並列化する方法は?

ファイルmachineAmachineBmachineCにコピーしているmachineAから以下のシェルスクリプトを実行しています。ファイルがmachineBにない場合は、machineCにあるはずです。

以下のシェルスクリプトは、ファイルをmachineATEST1およびTEST2ディレクトリにコピーします。

#!/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

bashスクリプトのループでプロセスを並列に実行する方法はありますか

現在、ファイルをmachineBおよびmachineCからmachineATEST1ディレクトリに最初にコピーし、それが完了すると、ファイルをコピーします。 machineBmachineCmachineATEST2ディレクトリに..TEST1TEST2ディレクトリの両方にあるファイルを転送する方法はありますか同時に?

Ubuntu12.04を実行しています

3
arsenal

それらをバックグラウンドに送信することに加えて、組み込みのwaitを使用して、すべてのバックグラウンドプロセスが終了するのを待ってから続行します。

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/.) &
    WAITPID="$WAITPID $!"
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/.) &
    WAITPID="$WAITPID $!"
done
wait $WAITPID
echo "All files done copying."
2
bahamat

できるよ:

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/ &

&最後にコマンドを切り離し、制御をスクリプトに戻します。

これをループに入れると、すべてのボディが並行して実行されます。これらすべてのバックグラウンドジョブが終了するのを待つには、

wait
1
Abdul

pssh プロジェクトを確認する必要があります。並列で実行されるpscpコマンドがありますscp

1
Gilles Quenot