Uw script heeft een aantal eigenaardigheden die waarschijnlijk moeten worden rechtgezet, ongeacht het onmiddellijke probleem.
kill -0 "$$" || exit 0
is raar en doet waarschijnlijk niets nuttigs. Ik denk je zou in dit geval waarschijnlijk gewoon niets moeten doen, omdat het doel van het script lijkt te zijn om de component te installeren als deze ontbreekt, en dan verder te gaan naar demongodb_status=
... deel.- Aangezien in principe alle commando's hier privileges hebben, zou het logischer zijn om het van tevoren af te breken als het hele script niet met privileges draait.
Stilistisch gezien is alles wat lijkt op sudo bash -c 'singlecommand'
zou gewoon sudo singlecommand
. moeten zijn; maar met de voorgestelde refactoring heb je deze helemaal niet nodig.
Het directe probleem met je script lijkt te zijn dat het even duurt voordat de server begint te luisteren op de poort waarvoor je het hebt geconfigureerd. Ik weet niet genoeg over Mongo om je te vertellen hoe je op de juiste manier moet wachten tot het je vertelt wanneer het "echt" is, maar het toevoegen van een sleep
is een veel voorkomende (zij het ruwe) oplossing. Een andere is om het logbestand te bekijken, op zoek naar de luistergebeurtenis.
#!/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
Ik ben niet helemaal tevreden met de startit
functie -- in eerste instantie mislukte het omdat ik probeerde het logbestand te openen terwijl het nog niet bestond, daarna mislukte het omdat de nieuwe regels in het logbestand al het opstartbericht bevatten na de slaap van één seconde. Nu kan het nog steeds mislukken als het logbestand wordt toegevoegd en de oude logs het opstartbericht van een vorige sessie bevatten. Maar dit zou je in ieder geval in de goede richting moeten helpen, hoop ik.
Hier is een refactoring die misschien robuuster zijn ...
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
}
De laatste sleep
is een beetje een wanhoopsdaad; het lijkt een fluitje van een cent te zijn nadat het het opstarten heeft geregistreerd totdat het goed is opgestart en luistert; en/of voeg misschien een nieuwe poging toe rond de laatste mongo
commando.