元の配列から配列を作成しますが、コードが実行されている場所に基づいていますか?

閃光

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"
グレンジャックマン

これはどうですか:それは使用します

  • 「ローカル」マシン名を保持する連想配列
  • scpのホストのシーケンスを保持する配列
  • 可能なホストを反復処理し、最初に成功したscpの後で中断するforループ
#!/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]

編集
0

コメントを追加

0

関連記事

分類Dev

Rails:文字列列に文字列の配列からのすべての単語が含まれているすべてのレコードを検索します

分類Dev

PHPは、別の配列から選択された要素に基づいて配列要素を削除します

分類Dev

列に文字列の配列からの文字列が含まれている場合は、で新しい列を作成します

分類Dev

フレーズが含まれているかどうかに基づいて配列を分離する

分類Dev

指定されたドキュメントの値が配列内にあるかどうかに基づいて、ブール値を使用して新しいフィールドを作成します

分類Dev

対応するインデックスに基づいて、ネストされた配列から新しい配列を作成します

分類Dev

フィルタに基づいて複数の配列からレコードを抽出します

分類Dev

最初の行に基づいて多次元NumPy配列をマージします

分類Dev

キー値に基づいて既存のハッシュから新しい配列を作成します

分類Dev

配列から年に基づいてグループ化された配列を作成する

分類Dev

numpy配列から列値に基づいて行番号を取得します

分類Dev

Foreach配列を作成し、インデックスに基づいて新しい配列を作成してから、それをループします

分類Dev

jsonが口述し、ネストされた列に基づいて複数の行を作成しますか?

分類Dev

ファイルから配列を作成し、bashの行に基づいて名前を付けます

分類Dev

配列からの特定の時間(秒単位)に基づいて関数を実行します

分類Dev

値に基づいて配列から要素を削除します

分類Dev

行の値に基づいて、columnxが複数の列よりも小さい場所を選択します

分類Dev

いくつかの値がphpで類似している場合、多次元から新しい配列を作成しますか?

分類Dev

値がインデックスの配列に基づいているブール配列を作成するにはどうすればよいですか?

分類Dev

renameFiles-ファイル名の配列を取得し、それらが配列に表示される回数に基づいて名前を変更します

分類Dev

配列の値がその場所に対応しているかどうかを確認します

分類Dev

内容の数が制限されている文字列配列の内容を、最後の配列位置から新しい文字列配列に転送します

分類Dev

配列の長さに基づいてフォルダとコンテンツをコピーするスクリプトを作成しますか?

分類Dev

リストに重複する要素が含まれている場合、コードが機能しません。配列が分離されているかどうかを確認するにはどうすればよいですか。

分類Dev

キーに基づいてオブジェクトから値の配列を作成します

分類Dev

異なる配列からの条件に基づいて2つのnumpy配列を交換します

分類Dev

異なる値形式の別の配列からの値が含まれている場合、配列から行を返します

分類Dev

特定の文字列が含まれているかどうかに基づいて列を再コーディングしようとしています

分類Dev

配列がLINQ式の配列の配列に含まれているかどうかを確認します

Related 関連記事

  1. 1

    Rails:文字列列に文字列の配列からのすべての単語が含まれているすべてのレコードを検索します

  2. 2

    PHPは、別の配列から選択された要素に基づいて配列要素を削除します

  3. 3

    列に文字列の配列からの文字列が含まれている場合は、で新しい列を作成します

  4. 4

    フレーズが含まれているかどうかに基づいて配列を分離する

  5. 5

    指定されたドキュメントの値が配列内にあるかどうかに基づいて、ブール値を使用して新しいフィールドを作成します

  6. 6

    対応するインデックスに基づいて、ネストされた配列から新しい配列を作成します

  7. 7

    フィルタに基づいて複数の配列からレコードを抽出します

  8. 8

    最初の行に基づいて多次元NumPy配列をマージします

  9. 9

    キー値に基づいて既存のハッシュから新しい配列を作成します

  10. 10

    配列から年に基づいてグループ化された配列を作成する

  11. 11

    numpy配列から列値に基づいて行番号を取得します

  12. 12

    Foreach配列を作成し、インデックスに基づいて新しい配列を作成してから、それをループします

  13. 13

    jsonが口述し、ネストされた列に基づいて複数の行を作成しますか?

  14. 14

    ファイルから配列を作成し、bashの行に基づいて名前を付けます

  15. 15

    配列からの特定の時間(秒単位)に基づいて関数を実行します

  16. 16

    値に基づいて配列から要素を削除します

  17. 17

    行の値に基づいて、columnxが複数の列よりも小さい場所を選択します

  18. 18

    いくつかの値がphpで類似している場合、多次元から新しい配列を作成しますか?

  19. 19

    値がインデックスの配列に基づいているブール配列を作成するにはどうすればよいですか?

  20. 20

    renameFiles-ファイル名の配列を取得し、それらが配列に表示される回数に基づいて名前を変更します

  21. 21

    配列の値がその場所に対応しているかどうかを確認します

  22. 22

    内容の数が制限されている文字列配列の内容を、最後の配列位置から新しい文字列配列に転送します

  23. 23

    配列の長さに基づいてフォルダとコンテンツをコピーするスクリプトを作成しますか?

  24. 24

    リストに重複する要素が含まれている場合、コードが機能しません。配列が分離されているかどうかを確認するにはどうすればよいですか。

  25. 25

    キーに基づいてオブジェクトから値の配列を作成します

  26. 26

    異なる配列からの条件に基づいて2つのnumpy配列を交換します

  27. 27

    異なる値形式の別の配列からの値が含まれている場合、配列から行を返します

  28. 28

    特定の文字列が含まれているかどうかに基づいて列を再コーディングしようとしています

  29. 29

    配列がLINQ式の配列の配列に含まれているかどうかを確認します

ホットタグ

アーカイブ