sql >> Databáze >  >> NoSQL >> MongoDB

Skript prostředí Bash se nepřipojuje k MongoDB, i když je stav aktivní

Váš skript má řadu zvláštností, které by pravděpodobně měly být napraveny bez ohledu na okamžitý problém.

  • kill -0 "$$" || exit 0 je divný a pravděpodobně nedělá nic užitečného. Hádám pravděpodobně byste v tomto případě neměli dělat nic, protože účelem skriptu je zřejmě nainstalovat komponentu, pokud chybí, a poté pokračovat do mongodb_status= ... část.
  • Vzhledem k tomu, že v podstatě všechny zde uvedené příkazy jsou privilegované, bylo by smysluplnější je předem ukončit, pokud celý skript neběží s oprávněními.

Stylisticky vše, co vypadá jako sudo bash -c 'singlecommand' by měl být pouze sudo singlecommand; ale s navrhovaným refaktoringem je vůbec nepotřebujete.

Bezprostřední problém s vaším skriptem se zdá být v tom, že chvíli trvá, než server začne naslouchat na portu, pro který jste jej nakonfigurovali. Nevím o Mongu dost na to, abych vám řekl, jak správně čekat, až vám řekne, kdy je to „skutečně“, ale přidáním sleep je běžné (i když hrubé) řešení. Dalším je prozkoumat soubor protokolu a vyhledat událost naslouchání.

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

Nejsem úplně spokojený s startit funkce -- nejprve to selhalo, protože jsem se pokusil otevřít soubor protokolu, když ještě neexistoval, pak se to nezdařilo, protože nové řádky v souboru protokolu již obsahovaly spouštěcí zprávu po jednosekundovém spánku. Nyní může stále selhat, pokud se připojuje soubor protokolu a staré protokoly obsahují spouštěcí zprávu z předchozí relace. Ale alespoň by vás to mělo nastartovat správným směrem, doufám.

Zde je refaktoring, který může být robustnější ...

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
}

Poslední sleep je tak trochu aktem zoufalství; zdá se, že to trvá chvíli poté, co zaprotokoluje spuštění, dokud se řádně nespustí a neposlouchá; a/nebo možná přidat opakovací smyčku kolem konečného mongo příkaz.




  1. Jaká je nejúčinnější knihovna/metoda meziprocesové komunikace node.js?

  2. MongoDB C# připojení/odpojení (oficiální ovladač)

  3. Jak přepnout booleovské pole v jednom dokumentu s atomickou operací?

  4. Mongodb vrací více výsledků dílčího pole a vylučuje ostatní vrácené výsledky