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 aumongodb_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.