14

しようとする前にたくさんのことをするbashシェルスクリプトがありmongorestoreます。

復元を試みる前に、MongoDB が稼働しているだけでなく、接続を受け入れる準備ができていることも確認したいと考えています。

現在、mongo プロセスは起動していますが、接続を受け入れる準備が整う前に、初期設定 (ジャーナル ファイルの設定など) を行うのに 45 秒以上かかります。理想的には、接続をループでテストし続け、接続できる場合にのみ実行したいmongorestore.

誰かがBashでこれを行う方法を教えてくれますか、それとも正しい方向に向けることができますか?

4

6 に答える 6

28

あなたが提案するようなループで接続をテストするには、

until nc -z localhost 27017
do
    sleep 1
done
于 2013-03-15T23:53:27.777 に答える
8

私は最近同じ問題を抱えていました。すべての出力をログファイルに記録するようにmongodを構成し、mongodの準備ができていることを示す出力が表示されるまで、ログファイルをチェックするループで待機することにしました。

これは、待機する必要があるログファイル出力行の例です。

Tue Dec  3 14:25:28.217 [initandlisten] waiting for connections on port 27017

これは私が思いついたbashスクリプトです:

#!/ビン/バッシュ

# mongo データ フォルダーとログファイルを初期化する
mkdir -p /data/db
touch /var/log/mongodb.log

# mongodb を起動してログを記録する
# --logpath この mongod がないと、すべてのログ情報が標準出力に出力されます。
# --logappend mongod がログファイルの末尾に新しいエントリを追加することを確認します。下のテールが常に何かを見つけるように、最初に作成します
/usr/bin/mongod --quiet --logpath /var/log/mongodb.log --logappend &

# 準備が整ったことを mongo がログに記録するまで待ちます (または 60 秒後にタイムアウトします)
カウンター=0
grep -q 'ポートで接続を待機中' /var/log/mongodb.log
[[ $? -ne 0 && $COUNTER -lt 60 ]] ; 行う
    睡眠 2
    カウンター+=2とする
    echo "mongo が初期化されるのを待っています... (ここまでの $COUNTER 秒)"
    grep -q 'ポートで接続を待機中' /var/log/mongodb.log
終わり

# これで mongo の準備が整い、他のコマンドを続行できることがわかりました
...

スクリプトは永遠に待機するわけではなく、60 秒後にタイムアウトになることに注意してください。ユース ケースによっては、それが必要な場合とそうでない場合があります。

于 2013-12-03T14:42:56.730 に答える
0

考えられる Docker ソリューション:

docker_idにとっては、次のdocker logsように読むことができます:

until [ $(docker logs --tail all $docker_id | grep "waiting for connections on port" | wc -l) -gt 0 ]; do
    printf '.'
    sleep 1
done

次に、mongo 依存のタスクを続行します。

于 2019-10-25T09:40:50.813 に答える