sql >> データベース >  >> NoSQL >> MongoDB

ステータスがアクティブな場合でも、BashシェルスクリプトがMongoDBに接続しない

    スクリプトにはいくつかの奇妙な点があり、差し迫った問題に関係なく、おそらく修正する必要があります。

    • kill -0 "$$" || exit 0 奇妙で、おそらく何も役に立ちません。私は推測 スクリプトの目的は、コンポーネントが欠落している場合にコンポーネントをインストールしてから、mongodb_status=に進むことであると思われるため、この場合はおそらく何もしないでください。 ...一部。
    • 基本的にここにあるすべてのコマンドには特権があるため、スクリプト全体が特権で実行されていない場合は、前もって中止する方が理にかなっています。

    様式的には、sudo bash -c 'singlecommand' のように見えるすべてのもの sudo singlecommandである必要があります;しかし、提案されたリファクタリングでは、これらはまったく必要ありません。

    スクリプトの当面の問題は、サーバーが構成したポートでリッスンを開始するのに時間がかかることです。 Mongoについては、「実際に」起動したときに適切に待機して、sleepを追加する方法を説明するのに十分な知識がありません。 一般的な(粗雑ではありますが)回避策です。もう1つは、ログファイルを調べて、リスニングイベントを探すことです。

    #!/bin/bash
    
    # Test for privileged access
    test -w / ||
    { echo "$0: need to run privileged; aborting" >&2; exit 127; }
    
    startit () {
        local log=/var/log/mongodb/mongod.log
        service mongod start
        while true; do
            test -e "$log" && break
            sleep 1
        done
        grep -q 'port: 27017' "$log" ||
        tail -0f "$log" |
        grep -q 'port: 27017'
    }
    
    if [ -f /usr/bin/mongod ]; then
        # Send diagnostic messages to standard error
        echo "$0: MongoDB is installed on your machine." >&2
    else
        # Reduce eyesore
        echo "$0: MongoDB is not installed; proceed with 4.0 install" >&2
        apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 68818C72E52529D4
        echo "deb http://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" >/etc/apt/sources.list.d/mongodb-org-4.0.list
        apt update && apt upgrade -y
        apt-get install -y mongodb-org
        # not necessary or useful to do a second time
        # apt update && apt upgrade -y
        apt -y autoremove && apt clean
        mkdir -p /data/db
        systemctl enable mongod
        startit
        # service mongod restart  # is this really useful and necessary?
    fi
    echo "$0: database initialization" >&2
    
    # Prefer modern command substitution syntax
    mongod_status=$(systemctl is-active mongod)
    echo "$mongod_status" >&2
    
    if [[ "${mongod_status}" == "active" ]]
    then
        echo "$0: MongoDB is already running." >&2
    else
        echo "$0: MongoDB is not running" >&2
        rm -f /var/lib/mongodb/mongod.lock
        startit
    fi
    
    mongo <<EOF
            use fragment
            db.createCollection("fragmenthash");
    EOF
    

    startitに完全に満足しているわけではありません 関数-最初はログファイルがまだ存在しないときにログファイルを開こうとしたために失敗しましたが、ログファイルの新しい行に1秒間のスリープ後に起動メッセージがすでに含まれていたために失敗しました。ログファイルが追加されていて、古いログに前のセッションからの起動メッセージが含まれている場合でも、失敗する可能性があります。しかし、少なくともこれで正しい方向に進むことができると思います。

    可能性があるリファクタリングは次のとおりです。 より堅牢になる...

    startit () {
        local log=/var/log/mongodb/mongod.log
        sudo -u mongodb touch "$log"
        service mongod start &
        local launcher=$!
        tail -0f "$log" |
        grep -q 'port: 27017'
        wait "$launcher"
        sleep 1
    }
    

    最後のsleep ちょっとした必死の行為です。スタートアップをログに記録してから、適切に起動してリッスンするまで、少し時間がかかるようです。および/または最後のmongoの周りに再試行ループを追加する可能性があります コマンド。




    1. MongoDBの2GBを超えるデータベース

    2. ClusterControlを使用してデータベースの構成テンプレートを管理する方法

    3. ネストされた配列mongodbから要素を削除します

    4. MongoDB:サブドキュメントの更新