ファイルmachineA
とmachineB
をmachineC
にコピーしているmachineA
から以下のシェルスクリプトを実行しています。ファイルがmachineB
にない場合は、machineC
にあるはずです。
以下のシェルスクリプトは、ファイルをmachineA
のTEST1
および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
からmachineA
TEST1
ディレクトリに最初にコピーし、それが完了すると、ファイルをコピーします。 machineB
とmachineC
をmachineA
TEST2
ディレクトリに..TEST1
とTEST2
ディレクトリの両方にあるファイルを転送する方法はありますか同時に?
Ubuntu12.04を実行しています
それらをバックグラウンドに送信することに加えて、組み込みの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."
できるよ:
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
pssh プロジェクトを確認する必要があります。並列で実行されるpscp
コマンドがありますscp