コマンドを実行し続け、最初のコマンドがゼロで終了すると停止します。

コマンドを実行し続け、最初のコマンドがゼロで終了すると停止します。

次の3つのコマンドがあります。

  mongo cdt_prod_playground --host "mngdb-cbt-stg-01:27058" -u cdtprodplayground -p "x" --eval "db.${file%.*}.remove({})"
  mongo cdt_prod_playground --host "mngdb-cbt-stg-02:27058" -u cdtprodplayground -p "x" --eval "db.${file%.*}.remove({})" 
  mongo cdt_prod_playground --host "mngdb-cbt-stg-03:27058" -u cdtprodplayground -p "x" --eval "db.${file%.*}.remove({})"

私はそれらを実行し、最初のものが成功した場合は停止したいと思います。 1つの方法は、配列に配置し、コマンドが成功するとループから外れることです。しかし、どうすればいいですか?

(これを行う必要があるのは、どのホストがPRIMARYレプリカセットであるかわからないため、実行する権限がないため、無差別テストしかできないためですrs.status()。)

答え1

どちらが現在のプライマリレプリケーションセットであるかを確認するには、すべてのレプリケーションセットメンバーに対してコマンドを試みるのではなく、コマンドラインでレプリケーションセット接続文字列を使用する必要がありますmongo。別のコマンドラインパラメータを使用する代わりに、接続文字列にユーザー名とパスワードの資格情報を含めることを選択できます。

MongoDB 3.6.3シェルを使用した例:

mongo "mongodb://USERNAME:PASSWORD@mngdb-cbt-stg-01:27058,mngdb-cbt-stg-02:27058/DATABASE?replicaSet=cdt_prod_playground" --eval "db.${file%.*}.remove({})"

接続文字列にレプリケーションセットのすべてのメンバーを一覧表示する必要はありません。上記の例では、2つを使用しました。これは、3つのメンバーで構成されるレプリカセットからプライマリレプリカを取得する必要があるためです(プライマリレプリカを維持するには投票メンバーの3分の2が必要です)。接続文字列に名前を含め、接続文字列内の少なくとも1つのメンバーが正常な場合、replicaSetドライバ/クライアントは現在のメンバーを決定します。

バラより接続文字列URI形式利用可能なオプションを参照してください。

また、呼び出しはdb.collection.remove({})インデックス定義を維持しながら個々の文書を削除することに注意してください。削除する必要があるコレクションデータの量が多い場合は、db.colellection.drop()必要なインデックスを呼び出して再作成する方が高速です。

これは、どのホストがPRIMARYレプリカセットであるのかわからないため、rs.status()を実行する権限がないため、無差別テストのみできるためです。

プログラムで現在のマスターデータベースを検索する必要がある場合は、次のものを使用できます。isMaster注文する。 MongoDBドライバとクライアント(シェルなど)は、mongo初期接続ネゴシエーションの一部としてこのコマンドを使用します。レプリケーション・セット・メンバーに接続すると、isMaster出力にprimary現在の項目に関する追加の詳細が含まれます。レプリカセットの状態

MongoDB 3.6では、このisMasterコマンドはドライバ/クライアントがサーバーを検索し、認証された接続をネゴシエートするために必要な情報を提供するために使用されるため、認証は不要です。

答え2

||IIUCでは、ifを使用してmongoゼロ以外のエラーを返すことで行を連結できます。に記載されているようにman bash:

An OR list has the form

           command1 || command2

   command2 is executed if and only if command1 returns a non-zero exit status.  The return status of AND and OR lists is the exit status of the last command executed in the list.

ここにはありませんが、mongo例を投稿できますsucceeds.sh

#!/usr/bin/env sh
nonexistent-command || \
echo a || \
echo b || \
echo c    

ランニング:

$ ./succeeds.sh
./succedds.sh: line 3: nonexistent-command: command not found
a

ご覧のとおり、スクリプトはa最初の成功したコマンドであるため停止されます。

答え3

hostlist=(mngdb-cbt-stg-01:27058 mngdb-cbt-stg-02:27058 mngdb-cbt-stg-03:27058)
hostnum=0
set -u
/bin/false; while [[ 0 -ne $? ]]; do 
  mongo cdt_prod_playground --host "${hostlist[$hostnum]}" -u cdtprodplayground -p "x" --eval "db.${file%.*}.remove({})"
  hostnum=$((hostnum+1))
done

関連情報