MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Bash-Shell-Skript kann keine Verbindung zu MongoDB herstellen, selbst wenn der Status aktiv ist

Ihr Skript weist eine Reihe von Kuriositäten auf, die unabhängig vom unmittelbaren Problem wahrscheinlich behoben werden sollten.

  • kill -0 "$$" || exit 0 ist seltsam und tut wahrscheinlich nichts Nützliches. Ich vermute Sie sollten in diesem Fall wahrscheinlich einfach nichts tun, da der Zweck des Skripts darin zu bestehen scheint, die fehlende Komponente zu installieren und dann mit mongodb_status= fortzufahren ... Teil.
  • Da im Grunde alle Befehle hier privilegiert sind, wäre es sinnvoller, gleich von vornherein abzubrechen, wenn das gesamte Skript nicht mit Privilegien läuft.

Stilistisch alles, was wie sudo bash -c 'singlecommand' aussieht sollte nur sudo singlecommand sein; aber mit dem vorgeschlagenen Refactoring brauchen Sie diese überhaupt nicht.

Das unmittelbare Problem mit Ihrem Skript scheint zu sein, dass es eine Weile dauert, bis der Server beginnt, den Port zu überwachen, für den Sie ihn konfiguriert haben. Ich weiß nicht genug über Mongo, um Ihnen zu sagen, wie Sie richtig darauf warten, dass es Ihnen sagt, wann es "wirklich" läuft, aber einen sleep hinzufügen ist eine gängige (wenn auch grobe) Problemumgehung. Eine andere besteht darin, die Protokolldatei zu untersuchen und nach dem Listening-Ereignis zu suchen.

#!/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

Ich bin mit dem startit nicht ganz zufrieden Funktion -- zuerst schlug es fehl, weil ich versuchte, die Protokolldatei zu öffnen, als sie noch nicht existierte, dann schlug es fehl, weil die neuen Zeilen in der Protokolldatei bereits die Startmeldung nach dem einsekündigen Ruhezustand enthielten. Jetzt kann es immer noch fehlschlagen, wenn die Protokolldatei angehängt wird und die alten Protokolle die Startmeldung einer vorherigen Sitzung enthalten. Aber zumindest sollte dies Sie in die richtige Richtung bringen, hoffe ich.

Hier ist eine Umgestaltung, die vielleicht ist robuster sein ...

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
}

Der letzte sleep ist ein bisschen wie ein Akt der Verzweiflung; es scheint einen Augenblick zu dauern, nachdem es den Start protokolliert hat, bis es richtig hochgefahren ist und zuhört; und/oder fügen Sie vielleicht eine Wiederholungsschleife um den letzten mongo hinzu Befehl.