2013-03-15 6 views
6

私はmongorestoreを試す前にたくさんのものをするbashシェルスクリプトを持っています。mongodbが起動していて、bashスクリプトからの接続を受け入れる準備ができているかどうかをチェックする方法は?

私は、mongodbだけでなく、復元を試みる前に接続を受け入れる準備ができていることを確認したいと思います。

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

誰か私にbashでこれを行う方法を教えてもらえますか、正しい方向に私を指摘できますか?

多くの感謝!

--su

+0

mongodインスタンスが準備完了状態になると、「ポート27017で接続を待っている」のようなログが記録されます。その出力行を待ってログをテールして、そのメッセージがログに記録されたらmongo restoreの実行を開始することができます。これが最善の解決策であるかどうかは分かりませんが、それはうまくいくはずです – ACE

答えて

7

私は最近、同じ問題を抱えていました。私はmongodにすべての出力をログファイルに記録し、mongodの準備が整ったことを示す出力が見えるまでログファイルをチェックするループを待つように設定することにしました。

これは、我々は待つ必要がある例のログファイルの出力ラインである:

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

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

 
#!/bin/bash 

# Initialize a mongo data folder and logfile 
mkdir -p /data/db 
touch /var/log/mongodb.log 

# Start mongodb with logging 
# --logpath Without this mongod will output all log information to the standard output. 
# --logappend Ensure mongod appends new entries to the end of the logfile. We create it first so that the below tail always finds something 
/usr/bin/mongod --quiet --logpath /var/log/mongodb.log --logappend & 

# Wait until mongo logs that it's ready (or timeout after 60s) 
COUNTER=0 
grep -q 'waiting for connections on port' /var/log/mongodb.log 
while [[ $? -ne 0 && $COUNTER -lt 60 ]] ; do 
    sleep 2 
    let COUNTER+=2 
    echo "Waiting for mongo to initialize... ($COUNTER seconds so far)" 
    grep -q 'waiting for connections on port' /var/log/mongodb.log 
done 

# Now we know mongo is ready and can continue with other commands 
... 

は、スクリプトは、永遠にそれを待つことはありません注意してください60秒後にはタイムアウトになります。ユースケースによっては、そうしたくないかもしれません。

+3

しかし、それが動作するようにmongoログをリセットする必要があります。 –

14

あなたがお勧めのようなループで接続をテストするには、

until nc -z localhost 27017 
do 
    sleep 1 
done 
+0

tog ...私はあなたの提案を試みましたが、うまくいきません。他のアイデア? –

+6

フィードバックが悪い:「うまくいかない」良いフィードバック: "コマンドをそのまま試してみたところ、永久に待っていました。stdout/stderrをチェックして、' bash:nc:command not found'を表示し続けました。 「tcp 0 192.168.1.17:27017 0.0.0.0:* LISTEN'。何が問題なのでしょうか?」というメッセージが表示されます。 (これらの場合は、netcatをインストールするか、localhostの代わりにlan ipで接続してください) –

+0

私は急いで返事をします。私はコマンドを逐語的に試してみたところ、無限ループであることが判明しました。即ち、mongodプロセスの状態が何であったとしても、ループは継続していた。 –

1

ほとんどの状況でTomの答えはかなりうまくいくが、-eフラグを付けてスクリプトを実行すると失敗する可能性がある。私は非常に一番上にset -eとあなたのスクリプトを実行することを意味します。どうして? Tomの答えは前のコマンドの終了ステータス(この場合はgrep -q)に依存するため、必要な文字列が見つからないと失敗し、スクリプト全体が失敗します。 -eフラグのドキュメントには、この問題を回避する方法についての手がかりを与える:

シェル終了しません失敗したコマンドは、すぐにしばらくやキーワードまで、 テストの一部次 コマンドリストの一部である場合if文では、& &または で実行されるコマンドの一部||最後の& &または||のいずれかのコマンド、パイプラインの最後のコマンド 、またはコマンドの戻りステータスが と反転されている場合を除いて、

したがって、1つの解決策は、grepコマンドをwhile条件の一部にすることです。しかし、彼は--logappendオプションでmongodbを実行しているので、検索文字列は以前の実行の結果として表示される可能性があります。私はトムの答えと他の男の答えを組み合わせ、それは本当によく働く:

# Wait until mongo logs that it's ready (or timeout after 60s) 
COUNTER=0 
while !(nc -z localhost 27017) && [[ $COUNTER -lt 60 ]] ; do 
    sleep 2 
    let COUNTER+=2 
    echo "Waiting for mongo to initialize... ($COUNTER seconds so far)" 
done 

何かのリスニングがある場合、それは実際にテストするので、私はTomcatを使用することが最善の解決策であることがわかります。

+0

これは優勝者です。ありがとうございました。 – tofutim

1

MongoDB Toolsを使用したソリューション。ドッカーのコンテナなどに似ていて、インストールしたくないところに便利ですnc

until mongo --eval "print(\"waited for connection\")" 
    do 
    sleep 60 
    done 

他の男の回答に基づいています。

関連する問題