machines
アレイ内に3台のマシン(それぞれ異なるデータセンターにあります)があります。
abc
データセンターで実行されている場合はmachineA.abc.host.com
、ローカルボックスとなるファイルをscpしたいと思います。ローカルボックスがダウンした場合にファイルをコピーするリモートサーバーとして、他の2つのボックスを選択します。def
データセンターで実行されている場合はmachineB.def.host.com
、ローカルボックスとなるファイルをscpしたいと思います。ローカルボックスがダウンした場合にファイルをコピーするリモートサーバーとして、他の2つのボックスを選択します。pqr
データセンターで実行されている場合はmachineC.pqr.host.com
、ローカルボックスとなるファイルをscpしたいと思います。ローカルボックスがダウンした場合にファイルをコピーするリモートサーバーとして、他の2つのボックスを選択します。以下は私のスクリプトですが、3つの異なる変数を使用してから、またはで区切られた3つのscp staetmentsを使用する代わりに、はるかに優れた方法で実行できると思います。
machines=(machineA.abc.host machineB.def.host.com machineC.pqr.host.com)
case $(hostname -f) in
*abc.host.com)
local_server=("${machines[0]}")
primary_remote==("${machines[1]}")
secondary_remote==("${machines[2]}")
;;
*def.host.com)
local_server=("${machines[1]}")
primary_remote==("${machines[2]}")
secondary_remote==("${machines[0]}")
;;
*pqr.host.com)
local_server=("${machines[2]}")
primary_remote==("${machines[0]}")
secondary_remote==("${machines[1]}")
;;
*) echo "unknown host: $(hostname -f), exiting." >&2 && exit 1 ;;
# ?
esac
export local="$local_server"
export remote1="$primary_remote"
export remote2="$secondary_remote"
copyFiles() {
el=$1
primsec=$2
# can we just iterate from for loop instead of writing three scp statements?
(scp -C -o StrictHostKeyChecking=no goldy@"$local":/proc/data/abc_187_"$el"_111_8.data "$primsec"/.) || (scp -C -o StrictHostKeyChecking=no goldy@"$remote1":/proc/data/abc_187_"$el"_111_8.data "$primsec"/.) || (scp -C -o StrictHostKeyChecking=no goldy@"$remote2":/proc/data/abc_187_"$el"_111_8.data "$primsec"/.)
}
export -f copyFiles
# using gnu parallel here to call above methods parallely
ご覧のとおり、3つのscpステートメントがあります。1つはローカルボックス用、もう1つはremote1とremote2用です。私が考えているのは、これら3つのscpステートメントを削除し、代わりにホスト名(特定の順序で、最初のインデックスはローカルボックス、他の2つはリモート)を配列に格納してから、その配列をforループから反復できることです。そして、1つのscpステートメントを書くだけですか?
for p in "$machines"; do scp -C -o StrictHostKeyChecking=no goldy@"$p":/proc/data/abc_187_"$el"_111_8.data "$primsec"/. && break; done > /dev/null 2>&1
これが可能な場合は、それにmachines
応じてアレイを再シャッフルする方法、または適切なインデックスで適切なマシンを使用して別のアレイを作成する方法を教えてください。
更新:
どういうわけか、その関数内の私のforループはまったく実行されていません:
copyFiles() {
local el=$1
local primsec=$2
local remote_file="/proc/data/abc_187_${el}_111_8.data"
for host in "${hosts[@]}"; do
echo "$host"
echo "scp -C -o StrictHostKeyChecking=no "goldy@$host:$remote_file" "$primsec"/." && break
done
}
export hosts
export -f copyFiles
parallel -j 5 copyFiles {} $proc::: ${pro[@]} &
parallel -j 5 copyFiles {} $data::: ${seco[@]} &
wait
echo "everything copied"
これはどうですか:それは使用します
#!/bin/bash
declare -A machines=(
[abc]=machineA.abc.host.com
[def]=machineB.def.host.com
[pqr]=machineC.pqr.host.com
)
IFS=. read -a host_parts < <(hostname -f)
case "${host_parts[1]}" in
abc) hosts=( "${machines[abc]}" "${machines[def]}" "${machines[pqr]}" ) ;;
def) hosts=( "${machines[def]}" "${machines[pqr]}" "${machines[abc]}" ) ;;
pqr) hosts=( "${machines[pqr]}" "${machines[abc]}" "${machines[def]}" ) ;;
*) echo "unknown host: $(hostname -f), exiting." >&2; exit 1 ;;
esac
copyFiles() {
local el=$1
local primsec=$2
local remote_file="/proc/data/abc_187_${el}_111_8.data"
for host in "${hosts[@]}"; do
scp -C -o StrictHostKeyChecking=no "goldy@$host:$remote_file" "$primsec"/. && break
done
}
export hosts
export -f copyFiles
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加