sql >> Database teknologi >  >> NoSQL >> MongoDB

Bash shell script får ikke forbindelse til MongoDB, selvom status er aktiv

Dit script har en række mærkværdigheder, som nok skal rettes op uanset det umiddelbare problem.

  • kill -0 "$$" || exit 0 er mærkeligt og gør sandsynligvis ikke noget nyttigt. Jeg gætter du burde sandsynligvis ikke gøre noget i dette tilfælde, da formålet med scriptet ser ud til at være at installere komponenten, hvis den mangler, og derefter fortsætte til mongodb_status= ... del.
  • Da stort set alle kommandoerne her er privilegerede, ville det give mere mening blot at afbryde på forhånd, hvis hele scriptet ikke kører med privilegier.

Stilistisk set alt, der ligner sudo bash -c 'singlecommand' skal kun være sudo singlecommand; men med den foreslåede refactoring har du slet ikke brug for disse.

Det umiddelbare problem med dit script ser ud til at være, at det tager et stykke tid for serveren at begynde at lytte på den port, du konfigurerede den til. Jeg ved ikke nok om Mongo til at fortælle dig, hvordan du skal vente på, at den fortæller dig, når den er "rigtigt", men tilføjer en sleep er en almindelig (omend rå) løsning. En anden er at undersøge logfilen og lede efter lyttehændelsen.

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

Jeg er ikke helt tilfreds med startit funktion -- først mislykkedes det, fordi jeg forsøgte at åbne logfilen, da den endnu ikke eksisterede, så mislykkedes det, fordi de nye linjer i logfilen allerede indeholdt opstartsmeddelelsen efter et sekunds dvale. Nu kan det stadig mislykkes, hvis logfilen tilføjes, og de gamle logfiler indeholder opstartsmeddelelsen fra en tidligere session. Men det her burde i det mindste få dig i gang i den rigtige retning, håber jeg.

Her er en refaktorering, som måske være mere robust ...

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
}

Den sidste sleep er lidt af en handling af desperation; det ser ud til at tage et snuptag, efter at den logger opstarten, indtil den er ordentligt oppe og lytter; og/eller måske tilføje en genforsøgsløkke omkring den sidste mongo kommando.




  1. Brug af aggregering til at sortere i kompleks betinget i Mongodb

  2. SCUMM:Den agentbaserede databaseovervågningsinfrastruktur i ClusterControl

  3. hvordan virker Mongodb-indekset?

  4. Redis - bedste måde at gemme et stort kort på (ordbog)