MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Le script shell Bash ne se connecte pas à MongoDB même si le statut est actif

Votre script comporte un certain nombre de bizarreries qui devraient probablement être corrigées quel que soit le problème immédiat.

  • kill -0 "$$" || exit 0 est bizarre et ne fait probablement rien d'utile. Je suppose vous ne devriez probablement rien faire dans ce cas, car le but du script semble être d'installer le composant s'il est manquant, puis de passer au mongodb_status= ... partie.
  • Comme fondamentalement, toutes les commandes ici sont privilégiées, il serait plus logique de simplement abandonner à l'avance si l'ensemble du script ne s'exécute pas avec des privilèges.

Stylistiquement, tout ce qui ressemble à sudo bash -c 'singlecommand' devrait être juste sudo singlecommand; mais avec la refactorisation proposée, vous n'en avez pas du tout besoin.

Le problème immédiat avec votre script semble être qu'il faut un certain temps au serveur pour commencer à écouter sur le port pour lequel vous l'avez configuré. Je n'en sais pas assez sur Mongo pour vous dire comment attendre correctement qu'il vous dise quand il est "pour de vrai" mais en ajoutant un sleep est une solution de contournement courante (bien que grossière). Une autre consiste à examiner le fichier journal, à la recherche de l'événement d'écoute.

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

Je ne suis pas entièrement satisfait du startit fonction - au début, cela a échoué parce que j'ai essayé d'ouvrir le fichier journal alors qu'il n'existait pas encore, puis cela a échoué parce que les nouvelles lignes du fichier journal contenaient déjà le message de démarrage après la veille d'une seconde. Maintenant, il peut toujours échouer si le fichier journal est ajouté et que les anciens journaux contiennent le message de démarrage d'une session précédente. Mais au moins, cela devrait vous aider à démarrer dans la bonne direction, j'espère.

Voici une refactorisation qui pourrait être plus robuste...

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
}

Le dernier sleep est un peu un acte de désespoir ; il semble prendre un instant après avoir enregistré le démarrage jusqu'à ce qu'il soit correctement opérationnel et à l'écoute ; et/ou peut-être ajouter une boucle de nouvelle tentative autour du mongo final commande.