sql >> Database >  >> NoSQL >> MongoDB

Bash-shellscript krijgt geen verbinding met MongoDB, zelfs als de status actief is

Uw script heeft een aantal eigenaardigheden die waarschijnlijk moeten worden rechtgezet, ongeacht het onmiddellijke probleem.

  • kill -0 "$$" || exit 0 is raar en doet waarschijnlijk niets nuttigs. Ik denk je zou in dit geval waarschijnlijk gewoon niets moeten doen, omdat het doel van het script lijkt te zijn om de component te installeren als deze ontbreekt, en dan verder te gaan naar de mongodb_status= ... deel.
  • Aangezien in principe alle commando's hier privileges hebben, zou het logischer zijn om het van tevoren af ​​te breken als het hele script niet met privileges draait.

Stilistisch gezien is alles wat lijkt op sudo bash -c 'singlecommand' zou gewoon sudo singlecommand . moeten zijn; maar met de voorgestelde refactoring heb je deze helemaal niet nodig.

Het directe probleem met je script lijkt te zijn dat het even duurt voordat de server begint te luisteren op de poort waarvoor je het hebt geconfigureerd. Ik weet niet genoeg over Mongo om je te vertellen hoe je op de juiste manier moet wachten tot het je vertelt wanneer het "echt" is, maar het toevoegen van een sleep is een veel voorkomende (zij het ruwe) oplossing. Een andere is om het logbestand te bekijken, op zoek naar de luistergebeurtenis.

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

Ik ben niet helemaal tevreden met de startit functie -- in eerste instantie mislukte het omdat ik probeerde het logbestand te openen terwijl het nog niet bestond, daarna mislukte het omdat de nieuwe regels in het logbestand al het opstartbericht bevatten na de slaap van één seconde. Nu kan het nog steeds mislukken als het logbestand wordt toegevoegd en de oude logs het opstartbericht van een vorige sessie bevatten. Maar dit zou je in ieder geval in de goede richting moeten helpen, hoop ik.

Hier is een refactoring die misschien robuuster zijn ...

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
}

De laatste sleep is een beetje een wanhoopsdaad; het lijkt een fluitje van een cent te zijn nadat het het opstarten heeft geregistreerd totdat het goed is opgestart en luistert; en/of voeg misschien een nieuwe poging toe rond de laatste mongo commando.




  1. MongoDB hoofdletterongevoelige index begint met prestatieproblemen

  2. Hoe kunnen Redis-lijsten worden gebruikt om een ​​chatsysteem te implementeren?

  3. Expressiestructuur wordt niet ondersteund op UpdateOneAsync

  4. MongoDB:automatisch gegenereerde ID's zijn nullen