sql >> Databasteknik >  >> NoSQL >> MongoDB

Bash-skalskriptet blir inte anslutet till MongoDB även om statusen är aktiv

Ditt manus har ett antal konstigheter som förmodligen borde rätas ut oavsett det omedelbara problemet.

  • kill -0 "$$" || exit 0 är konstigt och gör förmodligen inget användbart. Jag gissar du borde förmodligen helt enkelt inte göra något i det här fallet, eftersom syftet med skriptet verkar vara att installera komponenten om den saknas, och sedan fortsätta till mongodb_status= ... del.
  • Eftersom i princip alla kommandon här är privilegierade, skulle det vara mer meningsfullt att bara avbryta i förväg om hela skriptet inte körs med privilegier.

Stilmässigt, allt som ser ut som sudo bash -c 'singlecommand' ska bara vara sudo singlecommand; men med den föreslagna refaktoreringen behöver du inte dessa alls.

Det omedelbara problemet med ditt skript verkar vara att det tar ett tag för servern att börja lyssna på porten du konfigurerade den för. Jag kan inte tillräckligt mycket om Mongo för att berätta hur du korrekt väntar på att den säger till dig när den är "på riktigt" men lägger till en sleep är en vanlig (om än grov) lösning. En annan är att undersöka loggfilen och leta efter lyssningshä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

Jag är inte helt nöjd med startit funktion -- först misslyckades det eftersom jag försökte öppna loggfilen när den inte fanns ännu, sedan misslyckades det eftersom de nya raderna i loggfilen redan innehöll startmeddelandet efter en sekunds viloläge. Nu kan det fortfarande misslyckas om loggfilen läggs till och de gamla loggarna innehåller startmeddelandet från en tidigare session. Men det här borde åtminstone få dig igång i rätt riktning, hoppas jag.

Här är en refaktorering som kan vara mer 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 sista sleep är lite av en handling av desperation; det verkar ta en sväng efter att den loggat uppstarten tills den är ordentligt uppe och lyssnar; och/eller kanske lägga till en återförsök-loop runt den sista mongo kommando.




  1. Uppsättning i Mongo DB med officiell C#-drivrutin

  2. Mongo Map-Reduce To Mimic count(distinct(...)) group by in SQL

  3. 6 bästa MapReduce Job Optimization Techniques

  4. Hur konverterar jag en egenskap i MongoDB från text till datumtyp?